C语言middleWord文档格式.docx
《C语言middleWord文档格式.docx》由会员分享,可在线阅读,更多相关《C语言middleWord文档格式.docx(96页珍藏版)》请在冰点文库上搜索。
while(scanf("
%d"
&
n)==1)
solve(n);
return0;
方法2:
c=n-a-b;
//保证a+b+c=n
if(c>
b)//保证了c与b、a不会相同
if(isTriangle(a,b,c))
sum++;
else
break;
Problem2纯粹素数
#include<
string.h>
stdlib.h>
#defineMINM1013//1013是第一个大于1000的纯粹素数
#defineMAXN20//n的最大取值
#defineMAXD10
chardigit[MAXD+1];
intpureprime[MAXN+1];
intisPrime(inti)//判断参数i是否是素数
intj,m=sqrt(i*1.0);
if(i<
2)return0;
for(j=2;
j<
=m;
j++)
if(i%j==0)
return1;
intisPurePrime(intm)//判断参数m是否是纯素数
inti,len;
sprintf(digit,"
m);
//整数m转换成字符串保存在digit中
len=strlen(digit);
for(i=0;
i<
len;
i++)
if((digit[i]!
='
0'
)&
(isPrime(atoi(digit+i))==0))//atoi()将数字字符串转换成整数
voidinitialize()
inti;
intn=0;
for(i=MINM;
n<
MAXN;
i+=2)//只需处理奇数
if(isPurePrime(i))
pureprime[++n]=i;
initialize();
while(scanf("
&
n)!
=EOF)
pureprime[n]);
Problem3纯粹合数
#defineMINM100
#defineMAXN100//最多需要计算100个合数
intpureComposite[MAXN+1];
intcount;
intisComposite(intm)//判断参数m是否是合数
for(i=2;
i*i<
i++)
if(m%i==0)
intisPureComposite(intm)//判断参数m是否是纯合数
inti,len,num;
i<
num=atoi(digit+i);
//atoi()将数字字符串转换成整数
if(num&
isComposite(num)==0)
count=0;
count<
if(isPureComposite(i))
pureComposite[++count]=i;
pureComposite[n]);
Problem4求数列项
//p[1]=1,p[i]=p[i-1]+(i-1)*3+1
intmain()
inti,n;
intindex=1,delta=4;
intp[51];
p[1]=index;
for(i=2;
=50;
i++)
index+=delta;
delta+=3;
p[i]=index;
n)==1)
p[n]);
Problem5最高频率
intn,num,i;
inthash[110];
//hash[i]代表数i出现的次数,i的范围[1,109]。
intmax;
//存放最多次数
intvalue;
//出现最多次数的那个数
for(i=0;
110;
hash[i]=0;
max=0;
value=1;
for(i=0;
scanf("
num);
hash[num]++;
//num出现的次数加1
if(hash[num]==max&
num<
value)//当前数出现次数与max相同,并且当前数更小
value=num;
elseif(hash[num]>
max)//当前数出现次数>
max
max=hash[num];
}
printf("
value);
return0;
Problem6按要求输出序列
/*方法1:
读所有数据;
排序;
删除重复数据。
考虑到数据的值都在[0,109]范围,所以定义数组hash[110],元素值为0或1。
hash[num]的值为0时表示数num未出现过;
1表示数num已出现过。
循环读入一个num,设置hash[num];
最后输出时,当hash[num]值为1时,输出num。
下面是对应方法2的代码。
*/
#defineMAX110
//存放数的个数
intnum;
//存放读入的某个数
charhash[MAX];
//hash[num]的值为0时表示数num未出现过;
1表示数num已出现过
intfirst,i;
memset(hash,0,sizeof(hash));
hash[num]=1;
first=1;
//表示是否是第一个数
MAX;
if(hash[i]==1)
if(!
first)
"
);
i);
first=0;
\n"
Problem7特殊四位数
math.h>
voidtoArray(intn,int*p)//将参数n的各位数字分离到p指向的数组中
intcnt=0;
while(n)
p[cnt++]=n%10;
//分离最低位数字
n/=10;
//缩小10倍
intyes(intn)//判断n的千位数字与十位数字之和是否等于百位数字与个位数字之积
intarray[5];
//array[0]存放个位,...,array[3]存放千位
toArray(n,array);
if(array[3]+array[1]==array[2]*array[0])
intsqrtTest(intn)//判断n是否是某一个自然数的平方
intt=(int)sqrt((double)n);
if(t*t==n)
intn,i;
inta[3];
//符合条件的数只有3个
i=0;
for(n=1000;
10000;
n++)
if(yes(n)&
sqrtTest(n))
a[i++]=n;
a[n-1]);
Problem8找到最大数
voidswap(int*a,int*b)
inttemp=*a;
*a=*b;
*b=temp;
intn,array[1201];
//数的个数不超过1200个
intmax,pos;
n)==1&
n)
scanf("
array);
//读入第1个数据
max=array[0];
pos=0;
for(i=1;
array+i);
//读入数据到array[i]
if(array[i]>
max)
max=array[i];
pos=i;
swap(array,array+pos);
//第1个数和最大数交换
n-1;
i++)
printf("
%d"
array[i]);
Problem9螺旋方阵
版本1:
递归
#defineN10
intp[N][N];
/*对size*size的方阵按顺时针方向填数,填写最外层,从第begin行第begin列开始填写,开始数为number*/
voidFill(intnumber,intbegin,intsize)
if(size==0)//size为偶数时的结束条件
return;
if(size==1)//size为奇数时的结束条件
p[begin][begin]=number;
inti=0;
inth=begin,v=begin;
p[h][v]=number;
number++;
size-1;
i++)//往右
v++;
i++)//往下
h++;
i++)//往左
v--;
size-2;
i++)//往上
h--;
Fill(number,h,size-2);
//递归填写中心区域,从第h行第h列开始填写,开始数为number
}
intmain(void)
intr=0;
while(scanf("
&
n)==1)
if(r!
=0)printf("
Fill(1,0,n);
//填写n*n阶螺旋方阵的最外层,从第0行第0列开始填写,开始数为1
inth,v;
for(h=0;
h<
h++)
for(v=0;
v<
v++)
p[h][v]);
p[h][n-1]);
r++;
版本2:
非递归
intr;
voidfun(intn)//构造n阶螺旋方阵
intnum=n*n;
inti,j;
intdirection=0;
intround=0;
intkey=1;
int**a=(int**)malloc(sizeof(int)*n);
//给数组a行方向动态分配空间
i++)//给数组a列方向动态分配空间
a[i]=(int*)malloc(sizeof(int)*n);
i=0;
j=0;
while(key<
=num)//螺旋方阵构造过程:
从左到右,从上到下,从右到左,从下到上
a[i][j]=key++;
switch(direction%4)
case0:
//从左到右
if(j<
n-1-round)j++;
elseif(j==n-1-round)//到达最右
i++;
direction++;
case1:
//从上到下
n-1-round)i++;
elseif(i==n-1-round)//到达最下
j--;
case2:
//从右到左
if(j>
round)j--;
elseif(j==round)//到达最左
i--;
case3:
//从下到上
if(i>
round+1)i--;
elseif(i==round+1)//到达最上
j++;
round++;
//完成1圈
}
if(r!
=0)printf("
i++)//输出
for(j=0;
a[i][j]);
i++)
free(a[i]);
//释放空间
free(a);
//释放空间
{
r=0;
fun(n);
Problem10阵列
/*
设计思路:
1.先定义一个按规则构造好的10*10的数组s,定义一个10*10的数组t;
2.读入n,将数组t用0值初始化,将数组s中符合规则的数复制到数组t中,数组t中非0元素需要输出,0元素无需输出;
3.确定数组t中输出的开始行、结束行、开始列、结束列;
4.输出非0元素。
voidoutput2(int*p)//按2位宽度输出
if(*p!
=0)
%2d"
*p);
//左侧的0元素输出
voidoutput1(int*p)//按1位宽度输出
%1d"
intn,i,j,r1=0,r2=0;
ints[10][10]={73,72,71,70,69,68,67,66,65,100,
74,43,42,41,40,39,38,37,64,99,
75,44,21,20,19,18,17,36,63,98,
76,45,22,7,6,5,16,35,62,97,
77,46,23,8,1,4,15,34,61,96,
78,47,24,9,2,3,14,33,60,95,
79,48,25,10,11,12,13,32,59,94,
80,49,26,27,28,29,30,31,58,93,
81,50,51,52,53,54,55,56,57,92,
82,83,84,85,86,87,88,89,90,91};
intt[10][10];
introwBegin=0,rowEnd=0;
intcolumnBegin=0,columnEnd=0;
intcount,sum;
if(r1!
r1++;
memset(t,0,sizeof(t));
=9;
j<
j++)
if(s[i][j]<
=n)t[i][j]=s[i][j];
//统计有多少行需要输出
sum=0;
//存放第i行元素的和
sum+=t[i][j];
if(sum!
if(count==0)
rowBegin=i;
//记录需要输出的开始行
count++;
rowEnd=rowBegin+count-1;
//记录需要输出的结束行
//统计有多少列需要输出
//存放第j列元素的和
columnBegin=j;
//记录需要输出的开始列
columnEnd=columnBegin+count-1;
//记录需要输出的结束列
for(i=rowBegin;
=rowEnd;
intflag=1;
//右侧0元素出现时,置flag为0
r2=0;
for(j=columnBegin;
=columnEnd&
flag;
if(t[i][j]==0&
j!
=columnBegin)//右侧0元素出现
flag=0;
if(flag)//非0元素输出
if(r2!
r2++;
if(n<
10)
output1(&
t[i][j]);
if(n==10)
if(j==columnBegin)
output2(&
if(n==11)
if(j