1.設有數組\(A[i,j]\),數組的每個元素長度為三個字節,\(i\)的值為\(1~8\),\(j\)的值為\(1~10\),數組從內存首地址BA開始順序存放,當用以列為主存放時,元素\(A[5,8]\)的存儲的首地址是多少?
解答:依據公式:\(LOC(i,j)=LOC(0,0)+(n∗i+j)∗L\)(行序為主序存儲結構的公式,列序同理)
且數組\(A[i,j]\)=\(A[1..8,1...10]\) 則以列序為存儲結構的計算\(LOC(5,8)=BA+[(8*(8-1)+(5-1)]∗3\) ==BA+180
2. 設有一個10階的對稱矩陣A,采用壓縮存儲方式,以行序為主存儲,\(a_{11}\)為第一元素其存儲地址為1,每一個元素占一個地址空間 則\(a_{85}\)的地址是多少
解答
依據對稱矩陣的公式,當\(i>=j\) 時 \(K=i∗(i−1)/2+j−1\),則以行序存儲時思路即是前n項行和加上列
即\((8-1)*(8-1+1)/2+5==33\)
算法設計題
(1) 設任意N個整數存放於數組\(A[1...n]\)中,試編寫算法,將所有正數排在所有負數前面(要求:算法時間復雜度為O(n))
`void Arrange(int A[],int n)
//n個整數存在於數組A中,本算法將數組中所有正數排在所有負數前面
{ int i=0,j=n-1,x; //數組下標從0開始
while(i<j)
{ while(i<j&&A[j]>0) i++;
while(i<j&&A[j]<0) j--;
if(i<j)
{ x=A[i]; A[i++]=A[j]; A[j--]=x; } //交換A[i]與A[j]
}
}` ///結束
(2)寫一個算法統計在輸入字符串中各個不同字符出現的頻度並將結果存入文件(字符串中的合法字符為AZ這26個字母和09這10個數字)
```
void Count() //統計輸入字符串中數字字符和字母字符的個數
{ int i,num[36];
char ch;
for (i=0;i<36;i++) num[i]=0; //初始化
while((ch=getchar())!='#') //'#'表示輸入字符串結束
if('0'<=ch<='9')
{i=ch-48;num[i]++;} //數字字符
else if('A'<=ch<='Z')
{i=ch-65+10;num[i]++;} //字母字符
for(i=0;i<10;i++) //輸出數字字符的個數
cout<<"數字"<<i<<"的個數="<<num[i]<<endl;
for(i=10;i<36;i++) //求出字母字符的個數
count<<"字母字符"<<i+55<<"的個數="<<num[i]<<endl;
}
```
