万恶OJ:循环结构
ex_03_01
题目:
输入为若干整数,以-1结束(测试数据保证这组数中只有最后一个-1)。
输出共两行,第一行为三个整数(用一个空格分隔),依次为这组数中正数的个数,0的个数和负数的个数(不统计最后的-1)。
第二行为用一个空格分隔的两个整数,依次为这组数中所有正数的和及所有负数的和(不包括最后的-1)。测试数据保证求和的结果可以用int型存储。
分析:正常难度,注意不统计-1
#include <stdio.h>
int main()
{
int n,a=0,b=0,c=0,sum1=0,sum2=0;
while(1)
{
scanf("%d",&n);
if(n==-1)
break;
if(n>0)
{
a++;
sum1 += n;
}
if(n<0)
{
c++;
sum2 += n;
}
if(n==0)
b++;
}
printf("%d %d %d\n",a,b,c);
printf("%d %d",sum1,sum2);
return 0;
}
ex_03_02
题目:
输入为2行,第一行为整数n(1<n<200)。第二行为n个整数,这些整数均大于-10000且小于10000。
输出
只有一行,为用一个空格分隔的两个整数,依次为这n个整数中的最小值和最大值,中间用一个空格分隔。
分析:注意循环退出条件
#include <stdio.h>
int main()
{
int a,b,n=0,max,min;
scanf("%d",&a);
for(n=0;n<a;n++)
{
scanf("%d",&b);
if(n==0)
{
max = b;
min = b;
}
if(b>max)
max = b;
if(b<min)
min = b;
}
printf("%d %d",min,max);
return 0;
}
ex_03_03
题目:
输入为两个正整数a和b,(1<a,b<1000)
输出:
当a小于b时,计算开区间(a,b)中的所有素数,并按升序输出,当a>=b时,或该区间没有素数则输出error。
注意:输出的素数之间用一个空格分隔,最后一个素数后面没有空格。
分析:这道题还是挺难的,用数组会更为简单,难点一:用r作为标记,当r=1时为质数,输出;难点二:最后一个数后面没有空格,所以需要将第一个输出数据与其他数据区分开,则需要用一个变量来计数
#include <stdio.h>
int main()
{
int a,b,m,n,p=0,r=0;//用 r作为标记
scanf("%d %d",&a,&b);
if(a<b)
{
for(m=a+1;m<b;m++)
{
for(n=2;n<m;n++)
{
if(m%n!=0)
r=1;
else
{
r=0;
break;
}
}
if(r==1)
p++; //用 P计数
if(p==1 && r==1)
printf("%d",m);
if(p>1 && r==1)
printf(" %d",m);
}
}
if(p==0)
printf("error");
return 0;
}
ex_03_04
题目:
写一程序,输入三个整数a, b, c,(1<a,b,c<5000)
输出为满足方程ax+by=c,(0<x,y<100)的所有整数解,
要求:
1、每行输出一组解,x,y中间用一个空格分隔;
2、按(x,y)字典序升序输出所有解。
测试数据保证至少有一组解。
#include <stdio.h>
int main()
{
int a,b,c,x,y;
scanf("%d %d %d",&a,&b,&c);
for(x=1;x<100;x++)
{
if((c-a*x)%b==0)//判断y是否为整数
{
y=(c-a*x)/b;
if(y>0 && y<100)
printf("%d %d\n",x,y);
}
}
return 0;
}
ex_03_05
题目:
输入为一个正整数,该正整数小于2的31次方。
输出:
将该数的各位数字逆序输出。
思路:按字符一个一个输出
//方法一
#include <stdio.h>
int main()
{
int a,m,n;
scanf("%d",&a);
for(n=1;n<=a;n=n*10)
{
m=a%(n*10)/n;
printf("%d",m);
}
return 0;
}
//方法二
#include <stdio.h>
int main()
{
int a,b;
scanf("%d",&a);
while(a/10!=0)
{
b=a%10;
printf("%d",b);
a=a/10;
}
printf("%d",a);
return 0;
}
ex_03_06
题目:
输入为一个以换行符”\n”结尾的字符串,字符串长度大于0且小于200。
输出共两行,
第一行为将该字符串中的小写字母替换为大写字母后的字符串。
第二行为一个整数,为该字符串中所有元音字母的个数。
思路:应用getchar 实现连续输入,用数组会更简单
#include <stdio.h>
int main()
{
int n=0;
char a;
while(a!='\n')
{
a=getchar();
if(a>='a' && a<='z')
a = a - 32;
if(a=='A' || a=='E' || a=='I' || a=='O' || a=='U')
n++;
putchar(a);
}
printf("%d",n);
return 0;
}