总结一下这周做的几道算法题:
这周做的算法题有共同的特点,就是都是多组输入,所以先来总结一下多组输入输出的方式:
C语言多组输入
- 没有明确指出输入什么时候结束
如果是这种情况,默认是以“文件结束”(EOF)为结束标志。
应写成:
while(scanf("%d %d", &a, &b) != EOF)
{
处理每组输入数据
}
举个最简单的例子:
这道题没有明确指出什么时候输入结束,正确写法为:
#include<stdio.h>
int main(void)
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
printf("%d\n", a + b);
}
return 0;
}
- 指定数据,输入
这时候可以写成:
int n, a, b;
scanf("%d", &n);
while (n--)
{
这里处理每一组输入.然后直接按格式输出
}
return 0;
}
或者可以使用for循环,使用数组存储数据:
while(scanf("%d", &n) != EOF)
{
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
再举个做题中遇到的例子:
#include<stdio.h>
int main(void)
{
int n, a[100], ret;
while(scanf("%d",&n)!= EOF)
{
ret = 1;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 0; i < n; i++)
{
if(a[i] % 2 == 1)
{
ret = ret * a[i];
}
}
printf("%d\n", ret);
}
return 0;
}
-
以特定元素作结束符
如:以0或-1结束的输入.
while(scanf("%d",&n),n!=0) {
}
比如这道题目:
#include<stdio.h>
int Is_prime(int m)
{
int nav;
if(m < 0)
{
nav = 0;
}
if(m == 2)
{
nav = 1;
}
else
{
for(int i = 2; i < m; i++)
{
if(m % i == 0)
{
nav = 0;
break;
}
else
{
nav = 1;
}
}
}
return nav;
}
int main(void)
{
int x, y, flag;
while(scanf("%d %d", &x, &y), x != 0 || y != 0)
{
int count = 0;
for(int i = x; i <= y; i++)
{
int sum = i * i + i + 41;
int ret = Is_prime(sum);
if(ret == 1)
{
count++;
}
}
if(count == y - x + 1)
{
printf("OK\n");
}
else
{
printf("Sorry\n");
}
}
return 0;
}
C语言多组输出
这周几道题中常见的是输出之间有空格的题目
这里先总结两种情况:
- 未知总数的输出,可以把第一个数据直接输出,从第二个起的数据之前都加上一个空格。
- 已知数目的输出,每两个数据之间有一个空格
处理方法为:可以把前n-1个数输出后面带一个空格,第n个不加空格。
当然也可以使用第一种方法。
接下来,可以看一下两种方法的使用:
1.
#include<stdio.h>
#include<math.h>
int main(void)
{
int m, n;
while(scanf("%d %d", &m, &n) != EOF)
{
int count = 0;
for(int i = m; i <= n; i++)
{
int a = i % 10;
int b = i / 10 % 10;
int c = i / 100;
if(pow(a, 3) + pow(b, 3) + pow(c, 3) == i)
{
count++;
if(count == 1)
{
printf("%d",i);
}
else
{
printf(" %d",i);
}
}
}
if(count != 0)
{
printf("\n");
}
else
{
printf("no\n");
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
void reset(char* a, char* b)
{
char t;
t = *b;
*b = *a;
*a = t;
}
int main(void)
{
char a[3];
while(scanf("%s", &a) != EOF)
{
getchar();
if(a[0] > a[1])
{
reset(&a[0], &a[1]);
}
if(a[0] > a[2])
{
reset(&a[0], &a[2]);
}
if(a[1] > a[2])
{
reset(&a[1], &a[2]);
}
for (int i = 0;i < 3;i++)
{
if(i <= 1)
{
printf("%c ",a[i]);
}
else
{
printf("%c",a[i]);
}
}
printf("\n");
}
return 0;
}