螺旋矩陣的演算法
① 急求,用C語言實現N階螺旋數字方陣,謝謝
1. 編程,統計在所輸入的50個實數中有多少個正數、多少個負數、多少個零。
2. 編程,計算並輸出方程X2+Y2=1989的所有整數解。
3. 編程,輸入一個10進制正整數,然後輸出它所對應的八進制、十六進制數。
4. 一個數如恰好等於它的因子之和,這個數就稱為「完數」。編程序找出1000以內的所有完數,並輸出其因子(6是一個"完數",它的因子是1,2,3)。
5. 輸入一個正整數,輸出它的所有質數因子(如180的質數因子為 2、2、3、3、5)。
6. 輸入20個整數存入一數組,輸出其中能被數組中其它元素整除的那些數組元素。
7. 輸入兩個數組(數組元素個數自定),輸出在兩個數組中都出現的元素(如a[5]=,b[6]=,則輸出3、5)。
8. 輸入兩個數組(數組元素個數自定),輸出在兩個數組中都不出現的元素(如a[5]=,b[6]=,則輸出2、4、6、3、7、9、10、-1)。
9.編程,將字元數組S2中的全部字元拷貝到字元數組S1中(不用strcpy函數)。
10.給定年份year,判別該年份是否閏年(定義一個宏以判別該年份是否閏年)。
11.輸入一行小寫字母後,將字母變成其下一字母(a變成b、b變成c、c變成d、…、x變成y、y變成z、z變成a)輸出。
12. 編寫一個函數,處理n行、n列的二維數組:將每一行的元素同除以該行上絕對值最大的元素。
13. 編寫函數,求任意階多項式 a0+a1X+a2X2+...+anXn 的值並返回多項式的值。
14. 設計一個函數,使給出一個數的原碼,能得到該數的補碼。
15. 編寫函數,求m行、n列的二維數組全體元素中負數的個數。
16. 編寫函數,返回在一個整數組中出現次數最多的數及其出現次數。
17.編一個程序,打入月份號,輸出該月的英文月名,要求用指針數組處理。
18.編寫遞歸函數,將輸入的字元串按與輸入相反的順序輸出。
19. 編寫函數,在n個元素的一維數組中,統計比相鄰元素大的數組元素個數並將統計數返回(不考慮a[0]和a[n-1]),要求以指針變數而不是數組名作參數。
20. 編寫函數,在n個元素的一維數組中,找出最大值、最小值並傳送到調用函數。
21. 編寫一個函數,統計m行n列二維數組中有多少個正數、多少個負數,多少個零,並返回統計結果。
22. 寫一函數,在給定的一行以"."結束的字元中,找出最長的單詞並輸出。
23. 編寫一個函數print,列印一個學生的成績數組,該數組中有5個學生的數據記錄,每個記錄包括num,name,score[3],用主函數輸入這些記錄,用print函數輸出這些記錄。
24. 把文本文件d1.dat復制到文本文件d2.dat中,要求僅復制d1.dat中的英文字元。
25. 編程,把文本文件d1.dat復制到d2.dat(其中空格字元不復制)。
26. 編程,把文本文件d1.dat復制到d2.dat(其中大寫英文字母要轉換為小寫字母)。
27. 把文本文件d1.dat復制到文本文件d2.dat中,要求僅復制d1.dat中除英文字元和數字以外的其它內容。
28. 求出1至100之間的素數(只能被1和自身整除的數)並順序寫入文件su.dat。
29.磁碟文件a1和a2,各自存放一個已按字母順序排好的字元串,編程合並二個文件到a3文件中,合並後仍保持字母順序(如a1中存放:"accel",a2中存放"ilrz",則a3中為"acceillrz")。
30.已知順序文件C.DAT 存放著程序設計基礎的考試成績,每個記錄包含學號(8位字元)和成績(三位整數)兩個數據項。編製程序,從文件中讀入學生成績,將大於或等於60分的學生成績再形成一個新的文件SCORE60.DAT保存在A盤上,並顯示出學生總人數(少於1000)、平均成績和及格人數。
31.已知head指向一個帶頭結點的單向鏈表,鏈表中每個結點包含數據域和指針域。請編寫程序實現如圖所示鏈表的逆置。
若原鏈表為:
head
a
b
C ∧
逆置後鏈表應為:
head
c
b
a ∧
32、編制函數實現在一個帶頭結點(head)的單向鏈表(數據有序)中刪除相同數據的結點(相同數據的結點只保留一個)。
33、編制一程序,將字元computer賦給一個字元數組,然後從第一個字母開始間隔的輸出該串。請用指針完成。
34、編制一程序,將字元串的第m個字元開始的全部字元復製成另一個字元串,要求在主函數中輸入字元串及m的值並輸出復制結果,在被調用函數中完成復制。
35、有4名學生每個學生考4門課程,要求在用戶輸入學生學號以後能輸出該生的全部成績,用指針型函數來實現。請編寫函數float *search().
main()
,,,};
float search(),p;
int I,m;
printf(「enter the number of student:」);
scanf(「%d」,&m);
printf(「the score of NO.%dare:\n」,m);
p=search(score,m);
for(I=0;I<4;I++)
printf(「%52f\t」,*(p+I));
}
float search(float (pointer)[4],int n)
{}
36、有4名學生每個學生考4門課程,要求在用戶找出有不及格課程的學生學號並輸出全部成績,用指針來實現。
37、編制一程序實現將十進制數轉換成二進制數,並存放於一維數組b中,然後輸出。
38、以下函數p的功能是用遞歸方法計算x的n階勒讓德多項式的值。已有有調用語句p(n,x);請編寫p函數。遞歸公式如下:
1
X
PX(X)=
((2N-1)*X* Pn-1(X)-(n-1)* Pn-2(X)/n
39、編程實現如下5*5階的螺旋方陣。
1
2
3
4
5
16
17
18
19
6
15
22
21
20
7
14
23
24
25
8
13
12
11
10
9
40、編一程序實現求所有不超過200的N值,N的平方是具有對稱性質的迴文數。所謂迴文數就是將一個數從左向右與從右向左讀是一樣的,例如34543和1234321都是迴文數。
41、編寫一函數實現將一個整數按逆序存放到一個數組中。
42、請編寫程序:從鍵盤輸入一個字元串,將其中的小寫字母全部轉換成大寫字母,輸出到磁碟文件「upper.txt」中去保存。輸入的字元串以「!」結束。
43、設文件number.dat中存放了一組整數。請編程統計並輸出文件中正整數、負整數和零的個數。
44、請編程:從鍵盤上讀入一個16進制無符號數m,調用函數rightrot將m中的原始數據循環右移n位。並輸出移位前後的內容。
45、設計一遞歸函數計算下列函數:
PX(X,N)=X-X2+X3-X4+……+(-1)N-1XN(N>0)
46、設計一遞歸函數計算x的n次方。
47、設計一遞歸函數實現將小於32768的整數按逆序輸出。
48、設計一遞歸函數實現將小於32768的整數按逆序輸出。
49、設計一遞歸函數實現如下函數:
ack(m,n)= n+1 當m=0時
ack(m-1,1) 當n=0時
ack(m-1,ack(m,n-1)) 當n>0,m>0時
50、設計一遞歸函數實現將任一正整數轉達換成二進制數。
② 誰有螺旋矩陣的說明
關於螺旋矩陣的說法不一,這里指的是形如
21 22................
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
的矩陣。
問題有兩個:
1. 編程實現輸出這個矩陣
2. 設1點的坐標是(0,0),x方向向右為正,y方向向下為正.例如:7的坐標為(-1,-1) ,2的坐標為(0,1),3的坐標為(1,1).編程實現輸入任意一點坐標(x,y),輸出所對應的數字。
1. 第一個問題我是採用模擬進行構造的,可以看到從1開始的方向變化始終是 right->down->left->up,
所持續走的長度為1->1->2->2->3->3->...,發現了這個規律不難寫出代碼了!注意下面我把1的位置設置
在((n-1)/2, (n-1)/2)的位置。
void Simulate(int n)
{
int x, y;
x = y = (n - 1) / 2; //1的位置
data[x][y] = 1;
int len = 1;
int count = 0;
int num = 2;
DIRECTION dir = RIGHT;
while(num <= n * n)
{
for(int i = 0; i < len; i++)
{
switch(dir)
{
case LEFT:
--y; break;
case RIGHT:
++y; break;
case UP:
--x; break;
case DOWN:
++x; break;
default: break;
}
data[x][y] = num++;
}
count++;
if(count == 2)
{
count = 0;
len++;
}
dir = (DIRECTION)((dir + 1) % 4);
}
}
2. 第二個問題我也是先找出規律,然後進行模擬。
首先,不難看出n*n的螺旋矩陣的右下角的坐標一定是(m, m),這里m=n-1
通過觀察,可以看出 n=1的時候,右下角(0,0)的值為1,當n=2的時候,右下角(1,1)的坐標值為(3,3),當n=3的時候,右下角(2,2)的坐標值為13.直覺告訴我,這個值是關於n的二次函數,設f(n) = a*n^2 + b*n + c
聯立方程組,可以求得a,b,c。 最終算出來的f(n) = 4*n^2 - 2*n + 1
下面再根據(x,y)和右下角(n-1,n-1)之間的關系,計算出值即可。這里要注意當x的值與n-1相同時,應優先考慮y與-m是否有聯系。這就要求在函數中要注意x,y的判斷先後順序了。
代碼如下:
//以(1,1)所在位置作為原點,向右作為x正半軸,向下作為y正半軸
int GetValue(int x, int y)
{
int m = max(abs(x), abs(y));
int rightBottom = m * m * 4 - 2 * m + 1;
int value = 0;
if(x == -m)
{
value = rightBottom + 2 * m + m - y;
}
else if( y == m)
{
value = rightBottom + m - x;
}
else if(y == -m)
{
value = rightBottom + 4 * m + x + m;
}
else if( x == m )
{
value = rightBottom - (m - y);
}
return value;
}
③ 求一個C語言程序設計:螺旋矩陣.
螺旋矩陣:
#include<stdio.h>
main()
{
int a,b,k,n,i,j,a1,b1,m;
int lines[50][50];
scanf("%d",&n);
i=j=0;a=b=n;a1=b1=0;k=1;
if(n==1)
printf(" 1\n");
else
{
for(m=1;m<2*n;m++)
{
if(m%4==1)
{
for(;j<b;j++)
{
lines[i][j]=k;
k++;
}
i++;
j--;
b--;
}
else if(m%4==2)
{
for(;i<a;i++)
{
lines[i][j]=k;
k++;
}
j--;
i--;
a--;
}
else if(m%4==3)
{
for(;j>=b1;j--)
{
lines[i][j]=k;
k++;
}
i--;
j++;
b1++;
}
else
{
for(;i>=a1+1;i--)
{
lines[i][j]=k;
k++;
}
j++;
i++;
a1++;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ if(j==0)printf(" %2d ",lines[i][j]);
else if(j==n-1)printf("%2d",lines[i][j]);
else
printf("%2d ",lines[i][j]);
}
printf("\n");
}
}
}
和的話加一下就是了;
至於你說的那些個積什麼的,比較麻煩。自己再弄弄吧。