C语言日记3

万恶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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值