1001.3n+1猜想
#include <stdio.h>
int main()
{
int n,count=0;
scanf("%d",&n);
while(n)
{
if(n==1) break;
count++;
if(n%2)//奇数
n = (3*n+1)/2;
else
n = n/2;
}
printf("%d",count);
return 0;
}
2-05.求集合数据的均方差
#include <stdio.h>
#include <math.h>
#define MAX 10000
int a[MAX];
int main()
{
int n,i=0;
long long int sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
double add=0.0,avg,temp=0.0,result;
avg = 1.0*sum/n;
for(int i=0;i<n;i++)
{
temp = a[i]-avg;
temp = temp*temp;
add += temp;
}
result = sqrt(add/n);
printf("%.5lf",result);
return 0;
}
1002.写出这个数
#include <stdio.h>
#include <string.h>
char a[200]={0};
char c[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
int i,sum=0,out[900];
scanf("%s",a);
for(i=0;i<strlen(a);i++)
sum += a[i]-'0';
i=0;
while(sum)
{
out[i]=sum%10;
sum=sum/10;
i++;
}
for(i=i-1;i>0;i--)
printf("%s ",c[out[i]]);
printf(c[out[0]]);
return 0;
}
1004.成绩排名
#include <stdio.h>
#include <string.h>
#define MAX_NUM 100
char name[MAX_NUM][12],number[MAX_NUM][12];
int main()
{
int i=0,n,max=-1,min=101,score;
int maxindex=0,minindex=0;
scanf("%d",&n);
while(n--)
{
scanf("%s%s%d",name[i],number[i],&score);
//printf("%d",score);
if(score>max) {maxindex = i;max=score;}
if(score<min) {minindex = i;min=score;}
i++;
}
printf("%s %s\n",name[maxindex],number[maxindex]);
printf("%s %s",name[minindex],number[minindex]);
return 0;
}
1005.继续3n+1猜想
无力吐槽中,题目说了n不会超过100,所以对flag操作的时候没有考虑x的范围,因为不会数组越界,结果一直出现两个测试点的段错误..最后加了一句检验数组是否越界的if语句就通过了..
#include <stdio.h>
#include <stdlib.h>
int flag[101]={0};
int x,y[100];
int compare(const void* _a, const void* _b)
{
int* a=(int*) _a;
int* b=(int*) _b;
return *b-*a;
}
int main()
{
int n,i=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
y[i]=x;
if(flag[x]) continue;
while(x)
{
if(x==1) break;
if(x%2) x=(3*x+1)/2;
else x=x/2;
if(x<=100) flag[x]=1;//检查是否数组越界
}
}
flag[1]=0;
int ta=0;
qsort(y,n,sizeof(int),compare);
for(i=0;i<n;i++)
if(!flag[y[i]])
{
if(ta) printf(" ");
else ta=1;
printf("%d",y[i]);
}
return 0;
}
1006.换个格式输出
要注意限定输入x<10000,否则段错误
cnt1,cnt2,cnt3都要先初始化,否则段错误
#include <stdio.h>
#include <stdlib.h>
char word1[10],word2[10],word3[10];
int main()
{
int x,i,cnt1=0,cnt2=0,cnt3=0,count=0;
scanf("%d",&x);
if(x<1000)
{
while(x)
{
count++;
switch(count)
{
case 1:
cnt1=x%10;
for(i=0;i<cnt1;i++)
word1[i]=i+1+'0';
break;
case 2:
cnt2=x%10;
for(i=0;i<cnt2;i++)
word2[i]='S';
break;
case 3:
cnt3=x%10;
for(i=0;i<cnt3;i++)
word3[i]='B';
break;
}
x/=10;
}
}
for(i=0;i<cnt3;i++)
printf("%c",word3[i]);
for(i=0;i<cnt2;i++)
printf("%c",word2[i]);
for(i=0;i<cnt1;i++)
printf("%c",word1[i]);
return 0;
}
1007.素数对猜想
注意素数的函数返回值为int,开根操作需要特别注意。
主循环里j<=x否则答案错误
#include <stdio.h>
#include <math.h>
int is_prime(int x)
{
int i;
int m;
m=floor(sqrt(x)+0.5);
for(i=2;i<=m;i++)
if(x%i==0) return 0;
return 1;
}
int main()
{
int x,i,j,cnt=0;
scanf("%d",&x);
if(x>0)
{
for(i=3,j=5;j<=x;i+=2,j+=2)
{
if(is_prime(i) && is_prime(j))
cnt++;
}
printf("%d",cnt);
}
return 0;
}
1008.数组循环问题
注意要对m求余,否则当m>n时就会出错
#include <stdio.h>
#include <math.h>
int a[120],b[100];
void shift_array(int a[],int n,int m)
{
int i,j;
m = m%n;
for(i=n-m,j=0;i<n;i++)
b[j++]=a[i];
for(i=n-m-1;i>=0;i--)
a[i+m]=a[i];
for(i=0,j=0;i<m;i++)
a[i]=b[j++];
}
int main()
{
int N,M,flag=0;
scanf("%d%d",&N,&M);
int i;
if(N>=1 && N<=100)
{
for(i=0;i<N;i++)
scanf("%d",&a[i]);
}
if(M>=0)
shift_array(a,N,M);
for(i=0;i<N;i++)
{
if(!flag)
{
printf("%d",a[i]);
flag=1;
}
else
printf(" %d",a[i]);
}
return 0;
}
1009.说反话
#include <stdio.h>
#include <string.h>
int main()
{
int i,j=0,k;
char word[100];
char temp[80];
gets(word);
if(strlen(word)<=80)
{
for(i=strlen(word)-1;i>=0;i--)
{
if(word[i]==' ')
{
for(k=j-1;k>=0;k--)
printf("%c",temp[k]);
printf(" ");
j=0;
continue;
}
temp[j++]=word[i];
if(i==0)
{
for(k=j-1;k>=0;k--)
printf("%c",temp[k]);
}
}
}
return 0;
}
1010.一元多项式求导
注意如果第一次输入就是个常数,需要输出0 0...
#include <stdio.h>
#include <string.h>
int main()
{
int n, e, flag = 0;
while (scanf("%d%d", &n, &e) != EOF)
{
if( n*e )
{
if(flag)
printf(" ");
else
flag = 1;
printf("%d %d", n*e, e-1);
}
}
if(!flag) printf("0 0");
return 0;
}