您的位置:首页 > 其它

nyist——ACM新生牛刀小试 Round#1题解

2017-10-04 00:05 344 查看
下述代码有任何疑问都可以就近向学长请教,一道题有多个代码的只要求会使用代码1的形式

A题:基本的输入输出+循环

代码:

#include<stdio.h>

int main()
{
int n;//定义n
scanf("%d",&n);//输入n
while(n--)//循环n次
printf("I Love Acm.\n");//每次都输出一行I Love Acm.
return 0;
}


B题:基本的输入输出+保留整数(四舍五入)

代码:

#include<stdio.h>

double PI=3.1415926;

int main()
{
double r;//定义r
while(scanf("%lf",&r)!=EOF)//多组输入
printf("%.0lf\n",4.0/3.0*PI*r*r*r);//输出体积
return 0;
}


C题:循环语句的结束条件(无限组输入,a=0时结束)

代码1:

#include<stdio.h>

int main()
{
int a,b,c;//定义三个整型变量a,b,c
while(true)//无限执行while循环,因为判断条件为true
{
scanf("%d",&a);//输入a
if(!a)//如果a=0
break;//结束while循环
scanf("%d%d",&b,&c);//输入b和c
if(a+b>c&&a+c>b&&b+c>a)//任意两边之和大于第三边
printf("Great,you are genius!\n");//是三角形
else
printf("oh,my god!\n");//不是三角形
}
}


代码2:

#include<stdio.h>

int main()
{
int a,b,c;//定义三个整型变量a,b,c
while(scanf("%d",&a)&&a)//无限输入n,当a=0时(1&&0的结果为0),while里边的判断条件为假结束循环
{
scanf("%d%d",&b,&c);//输入b和c
if(a+b>c&&a+c>b&&b+c>a)//任意两边之和大于第三边
printf("Great,you are genius!\n");//是三角形
else
printf("oh,my god!\n");//不是三角形
}
}


D题:if判断语句的使用

代码:

#include<stdio.h>

int main()
{
int n;//定义n
scanf("%d",&n);//输入n
while(n--)//n组数据
{
int m;//定义m
scanf("%d",&m);//输入m
if(m>=90)//m不可能大于100,所以直接判断m是否大于等于90
printf("A\n");
else if(m>=80)//不满足第一个if条件,那么m肯定小于90,所以直接判断m是否大于等于80
printf("B\n");
else if(m>=70)
1832b
//同理,直接判断m是否大于等于70
printf("C\n");
else if(m>=60)//同理,直接判断m是否大于等于60
printf("D\n");
else//剩下的就是小于60的数了
printf("E\n");
}
return 0;
}


E题:和整型比较大小一样,注意用getchar吸收掉换行,考察逻辑能力?

代码:

#include<stdio.h>

int main()
{
int t;//定义整型变量t
scanf("%d",&t);//输入t
getchar();//getchar()吸收一个字符,吸收掉了t后的换行(换行也是字符)
while(t--)//t组数据
{
char a,b,c,temp;//定义字符型变量a,b,c,temp
scanf("%c%c%c",&a,&b,&c);//输入a,b,c,temp
getchar();//吸收掉了输入c后的换行
if(a>b)
{
temp=a;
a=b;
b=temp;
}//执行完if语句后,确定状态a<=b
if(b>c)
{
temp=b;
b=c;
c=temp;
}//执行完if语句后,确定状态b<=c(b的值有可能在此步骤后变化)
if(a>b)
{
temp=a;
a=b;
b=temp;
}//执行完if语句后,确定状态a<=b(因为b的值有可能在上一步中变化了,所以我们需要重新比较a和b的大小)
printf("%c %c %c\n",a,b,c);//输出a,b,c
}
return 0;
}


F题:for循环和break的使用

代码1:

#include<stdio.h>

int main()
{
int a,b,c;//定义三个整型变量a,b,c
int flag=0;//定义变量flag,用以判断是否已经找到了满足条件的值
scanf("%d%d%d",&a,&b,&c);//输入a,b,c
for(int i=10; i<=100; ++i)//i从10一步一步递加到100
{
if(i%3==a&&i%5==b&&i%7==c)//i满足条件
{
flag=1;//flag=1表明已经找到了满足条件的值
printf("%d\n",i);//输出i
break;//结束循环语句
}
}
if(flag==0)//flag=0表明没有找到满足条件的值
printf("No answer\n");//输出No answer
return 0;
}


代码2:

#include<stdio.h>

int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int i=10; i<=100; ++i)
{
if(i%3==a&&i%5==b&&i%7==c)
{
printf("%d\n",i);
return 0;//直接结束main函数,表明后面的代码不会再执行了
}
}
printf("No answer\n");//能够执行到这里,表明前面并没有找到满足条件的值
return 0;
}


G题:直接判断

代码1:

#include<stdio.h>

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)//多组输入
{
if(n==0&&m==0)//n和m同时为0时,while循环结束
break;
int a[5],b[5];
a[1]=n%10;//n的个位
a[2]=n/10%10;//n的十位
a[3]=n/100;//n的百位
b[1]=m%10;//m的个位
b[2]=m/10%10;//m的十位
b[3]=m/100;//m的百位
int tot1=0,tot2=0,ans=0;//tot表示是否进位,ans表示有几次进位,tot1是个位进位,tot2是十位进位
if(a[1]+b[1]>9)
++ans,tot1=1;
if(a[2]+b[2]+tot1>9)//n和m十位上的数加上个位的进位(如果个位不进位tot1为0,进位则tot1为1)
++ans,tot2=1;
if(a[3]+b[3]+tot2>9)//同理
++ans;
printf("%d\n",ans);
}
return 0;
}


代码2:

#include<stdio.h>

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)//多组输入
{
if(n==0&&m==0)//n和m同时为0时,while循环结束
break;
int ans=0;//ans记录有多少次进位
if((n%10)+(m%10)>9)//如果个位能进位
{
++ans;//ans+1
if((n/10%10)+(m/10%10)>8)//如果十位能进位(个位进位了,所以十位上的和只要大于8,
{//再加上进位的1,最后结果肯定大于9)
++ans;//ans+1
if(n/100+m/100>8)//如果百位能进位(同理)
{
++ans;//ans+1
}
}
}
else//个位没有进位
{
if((n/10%10)+(m/10%10)>9)//如果十位能进位(个位没进位,所以是>9)
{
++ans;
if(n/100+m/100>8)//如果百位能进位(>8也是同上面的>8一样的道理)
{
++ans;//ans+1
}
}
else//十位也没有进位
{
if(n/100+m/100>9)//如果百位能进位(个位和十位都没有进位,所以是>9)
{
++ans;
}
}
}
printf("%d\n",ans);
}
return 0;
}


代码3:

#include<stdio.h>

int main()
{
int n,m;
while(~scanf("%d%d",&n,&m),n||m)//仅是这里和代码1不一样,想了解这个的可以就近问学长
{
int ans=0;
if((n%10)+(m%10)>9)
{
++ans;
if((n/10%10)+(m/10%10)>8)
{
++ans;
if(n/100+m/100>8)
{
++ans;
}
}
}
else
{
if((n/10%10)+(m/10%10)>9)
{
++ans;
if(n/100+m/100>8)
{
++ans;
}
}
else
{
if(n/100+m/100>8)
{
++ans;
}
}
}
printf("%d\n",ans);
}
return 0;
}


H题:寻找最小值,

代码1:

#include<stdio.h>

int main()
{
int n,a[110];//定义整型变量n,和一个能容纳110个数据的整型数组a[110]
while(scanf("%d",&n)!=EOF)
{
if(!n)
break;
for(int i=1; i<=n; ++i)//输入n个数
scanf("%d",&a[i]);
int Min_v=a[1],index=1;//Min_v存储最小的数,index存储最小的数的下标,这句代码的意思就是假设a[1]为最小的值
for(int i=2; i<=n; ++i)//遍历后面的数,寻找更小的数
if(Min_v>a[i])//如果有更小的数
Min_v=a[i],index=i;//将更小的数的值赋给Min_v,同时更新更小的数的下标
int temp=a[1];//交换最小的数和第一个数
a[1]=a[index];//...
a[index]=temp;//...
for(int i=1; i<n; ++i)//输出交换后的序列
printf("%d ",a[i]);
printf("%d\n",a
);
}
return 0;
}


代码2:

#include<stdio.h>

int main()
{
int n,a[110];
while(scanf("%d",&n),n)//仅是这里和代码1不一样,想了解这个的可以就近问学长
{
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
int Min_v=a[1],index=1;
for(int i=2; i<=n; ++i)
if(Min_v>a[i])
Min_v=a[i],index=i;
int temp=a[1];
a[1]=a[index];
a[index]=temp;
for(int i=1; i<n; ++i)
printf("%d ",a[i]);
printf("%d\n",a
);
}
return 0;
}


I题:判断素数

代码1:

#include<stdio.h>

bool judge_isPrime(int x)//判断一个数x是否是素数
{
if(x<2)
return false;
for(int i=2; i<x; ++i)//除了1和它本身外没有其他的约数
if(x%i==0)//如果有其他的约数
return false;//说明不是素数,返回false
return true;//能执行到这里说明没有其他的约数,返回true
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(judge_isPrime(n))//先判断n是不是素数
{
printf("%d\n",n);//是素数则输出
continue;//输出后则之间跳过本次循环,开始进行下一次循环
}
for(int i=1,le=n,ri=n;ri<1000||le>1;++i)//循环的结束条件是le和ri都超出范围,只有一个超出范围还不能结束
{
ri=n+i;//ri表示右边的数
if(judge_isPrime(ri))//如果ri是素数
{
printf("%d\n",ri);//则输出ri
break;//并结束for循环
}
le=n-i;//le表示左边的数
if(judge_isPrime(le))//如果le是素数
{
printf("%d\n",le);//则输出le
break;//并结束for循环
}
}
}
return 0;
}


代码2://这种方法如果实在看不懂可以直接略过

#include<stdio.h>

int a[1010];

void init()//素数筛法打表(大概第5天或者第6天会讲到,想提前了解的可以就近问学长)
{
a[0]=1,a[1]=1;
for(int i=2;i<=1000;++i)
{
if(!a[i])
{
for(int j=i+i;j<=1000;j+=i)
a[j]=1;
}
}
}

int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(!a
)
{
printf("%d\n",n);
continue;
}
for(int i=1,le=n,ri=n;ri<1000||le>1;++i)
{
ri=n+i;
if(!a[ri]&&ri<=1000)
{
printf("%d\n",ri);
break;
}
le=n-i;
if(!a[le]&&le>1)
{
printf("%d\n",le);
break;
}
}
}
return 0;
}


J题:这种题观察规律后,直接模拟

代码:

#include<stdio.h>

int main()
{
int n,flag=0;//两组数据之间有空行,最后一组数据之后没空行,所以我们定义flag表示接下来的这组数据前面是否有过数据了
while(~scanf("%d",&n))
{
if(!flag)
flag=1;//这组数据就是下一组的前一组数据
else
printf("\n");//有数据则输出空行,这样就能保证两组数据之间有空行,最后一组数据之后没空行
for(int i=1; i<=n-1; ++i)//先模拟最长的那一行的上面n-1行
{
for(int j=1; j<=i-1; ++j)//第一个类型是空格,所以我们找出空格的规律
printf(" ");
for(int j=1; j<=n+1-i; ++j)//然后是*,找出*的规律
printf("*");
for(int j=1; j<=n-1-i; ++j)//然后又是空格,找规律
printf(" ");
for(int j=1; j<=i; ++j)//最后又是*没,找规律
printf("*");
printf("\n");//这样一行就结束了,所以输出换行
}
for(int i=1;i<=2*n-1;++i)//输出最长的那一行
printf("*");
printf("\n");
for(int i=1;i<=n-1;++i)//对下面的n-1行进行找规律
{
for(int j=1;j<=n-i;++j)//第一个类型是*
printf("*");
for(int j=1;j<=i-1;++j)//接着是空格
printf(" ");
for(int j=1;j<=i+1;++j)//接着*
printf("*");
for(int j=1;j<=n-1-i;++j)//最后空格
printf(" ");
printf("\n");//一行结束,则换行
}
}
return 0;
}


下面的代码也是AC的代码,但是里面可能有一些东西比较难理解,所以下面的代码有兴趣的同学看一下就行了

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;

const double PI=3.1415926;

/*A题
int main()
{
int n;
scanf("%d",&n);
while(n--)
printf("I Love Acm.\n");
return 0;
}
*/

/*B题
int main()
{
double r;
while(~scanf("%lf",&r))
printf("%.0lf\n",4.0/3.0*PI*r*r*r);
return 0;
}
*/

/*C题
int main()
{
int a,b,c;
while(scanf("%d",&a))
{
if(!a)
break;
scanf("%d%d",&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
printf("Great,you are genius!\n");
else
printf("oh,my god!\n");
}
}
*/

/*D题
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
if(m>=90)
printf("A\n");
else if(m>=80)
printf("B\n");
else if(m>=70)
printf("C\n");
else if(m>=60)
printf("D\n");
else
printf("E\n");
}
return 0;
}
*/

/*E题
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char a,b,c;
getchar();
scanf("%c%c%c",&a,&b,&c);
char x=min(min(a,b),c);
char y=max(max(a,b),c);
char z=(char)(a^b^c^x^y);
printf("%c %c %c\n",x,z,y);
}
return 0;
}
*/

/*F题
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int i=10; i<=100; ++i)
{
if(i%3==a&&i%5==b&&i%7==c)
{
printf("%d\n",i);
return 0;
}
}
printf("No answer\n");
return 0;
}
*/

/*G题
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m),n||m)
{
int ans=0;
if((n%10)+(m%10)>9)
{
++ans;
if((n/10%10)+(m/10%10)>8)
{
++ans;
if(n/100+m/100>8)
{
++ans;
}
}
}
else
{
if((n/10%10)+(m/10%10)>9)
{
++ans;
if(n/100+m/100>8)
{
++ans;
}
}
else
{
if(n/100+m/100>9)
{
++ans;
}
}
}
printf("%d\n",ans);
}
return 0;
}
*/

/*H题
int main()
{
int n,a[110];
while(scanf("%d",&n),n)
{
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
int w=a[1],c=1;
for(int i=2; i<=n; ++i)
if(w>a[i])
w=a[i],c=i;
swap(a[1],a[c]);
for(int i=1; i<n; ++i)
printf("%d ",a[i]);
printf("%d\n",a
);
}
return 0;
}
*/

/*I题
int a[1010];

void init()
{
a[0]=1,a[1]=1;
for(int i=2;i<=1000;++i)
{
if(!a[i])
{
for(int j=i+i;j<=1000;j+=i)
a[j]=1;
}
}
}

int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(!a
)
{
printf("%d\n",n);
continue;
}
for(int i=1,l=n,r=n;r<1000||l>1;++i)
{
r=n+i;
if(!a[r]&&r<=1000)
{
printf("%d\n",r);
break;
}
l=n-i;
if(!a[l]&&l>1)
{
printf("%d\n",l);
break;
}
}
}
return 0;
}
*/

/*J题
int main()
{
int n,flag=0;
while(~scanf("%d",&n))
{
if(!flag)
flag=1;
else
puts("");
for(int i=1; i<=n-1; ++i)
{
for(int j=1; j<=i-1; ++j)
printf(" ");
for(int j=1; j<=n+1-i; ++j)
printf("*");
for(int j=1; j<=n-1-i; ++j)
printf(" ");
for(int j=1; j<=i; ++j)
printf("*");
printf("\n");
}
for(int i=1;i<=2*n-1;++i)
printf("*");
printf("\n");
for(int i=1;i<=n-1;++i)
{
for(int j=1;j<=n-i;++j)
printf("*");
for(int j=1;j<=i-1;++j)
printf(" ");
for(int j=1;j<=i+1;++j)
printf("*");
for(int j=1;j<=n-1-i;++j)
printf(" ");
printf("\n");
}
}
return 0;
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: