题目19:数字串处理
给你一串数字,找出在这串数字中连续出现次数最多的那个数字;若有多个数字连续出现的次数相当,则找出第一次出现该次数的那个数字。
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有2行,测试数据的第一行有1个整数n(1<n<100),表示数字串中有几个数;测试数据的第二行有n个数,数字串中的数字k,k(1 ≤k ≤100),每个数字之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
每组运算结果为两个整数:出现次数最多的那整数,以及它的出现次数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
总结:
1. 创建辅助数组b[n]存储连续计数,b[i]的值为a[i]连续出现的次数
2. max寻找连续出现次数最多的下标,当遇到相同长度时不更新max值,保留第一个最长段的位置
#include <stdio.h>
int main(){
int n;
while(scanf("%d", &n) != EOF){
int m, max = 0;
int a[n], b[n];
b[0] = 1;
for(int i = 0; i < n; i++){
scanf("%d", &m);
a[i] = m;
}
for(int i = 1; i < n; i++){
if(a[i – 1] == a[i])
b[i] = b[i – 1] + 1;
else
b[i] = 1;
}
for(int i = 1; i < n; i++){
if(b[max] < b[i])
max = i;
}
printf("%d %d\\n", a[max], b[max]);
}
return 0;
}
题目20:公式求解
给定两个正整数a、b,求所有的正整数x和y,使a^2 + x^2 = b^2 + y^2,其中a、b、x、y都不大于100。在所有的有效解中,按x的大小进行排序,从小到大输出。
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据:每组测试数据由一个不大于100的正整数a后跟一个不大于100的正整数b组成,a和b之间由一个空格分开,形成一行数据,其行首和行尾都没有任何空格,当a和b同时为0时,表示输入结束;每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
每组运算结果由一个不大于100的正整数x后跟一个不大于100的正整数y组成,x和y之间由一个空格分开,形成一行数据,其行首和行尾都没有任何空格;如果有多组相应的运算结果,则按x的大小进行排序,从小到大输出。 每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。
总结:
1. 两个for循环使x y遍历1-100,找到满足式子a^2 + x^2 = b^2 + y^2时输出x y
2. flag用于在输出第二组及以后的数据前输出换行符(为满足该条件:每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行)
#include <stdio.h>
int main(){
int a, b, flag = 1;
while(scanf("%d %d", &a, &b) != EOF){
if (a == 0 && b == 0)
break;
if(flag != 1)
printf("\\n");
flag = 0;
for(int x = 1; x <= 100; x++){
for(int y = 1; y <= 100; y++){
if(x * x – y * y == b * b – a * a)
printf("%d %d\\n", x, y);
}
}
}
return 0;
}
题目21:累加式
累加式是一种表达式,这种表达式的构成方法是这样的:从1开始加,其后的每一个数都比前一个数大1,然后加到某一个数后停止递增,之后每加的一个数都比前一个数小1,一直加到1为止,这样构成的一个表达式称为累加式。 例如1+2+3+4+3+2+1就是一个累加式,它从1开始加到4,然后再加到1,完成累加的过程。给你一个正整数n,完成从1到n再到1的累加式的构造。
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包含一个正整数n(1≤n≤10)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果由一个1到n再到1的累加式构成,累加式中不包含空格;每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
总结:
1. 先使用一个for循环令i 从1-n,输出1+2+···+n;随后令j 从n – 1到1输出+ (n – 1) +····+2+1
2. flag确保有多组输入时,每组输出之间用空行分隔,但第一组运算结果前面以及最后一组运算结果后面也都没有任何空行
#include <stdio.h>
int main(){
int n, flag = 1;
while(scanf("%d", &n) != EOF){
if(flag != 1)
printf("\\n");
flag = 0;
for(int i = 1; i <= n ; i++){
printf("%d", i);
if(i < n)
printf("+");
}
for (int j = n – 1; j >= 1; j–) {
printf("+%d", j);
}
}
return 0;
}

