54 等差数列
作者: xxx时间限制: 1S章节: 一维数组
问题描述 :
一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...) 在这个问题中a是一个非负的整数,b是正整数。
写一个程序来找出在双平方数集合S中长度为n的等差数列。双平方数集合是所有能表示成p2+q2的数的集合。
输入说明 :
第一行: N(3<= N<=25),要找的等差数列的长度。 第二行: M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。
输出说明 :
如果没有找到数列,输出`NONE'。
如果找到了,输出一行或多行, 每行由两个整数组成:a,b 这些行应该先按b排序再按a排序(均为升序)。
将不会有多于10,000个等差数列。
#include <stdio.h>
struct ab{
int a;
int b;
};
struct ab sure[10001];
int main() {
int n, scope, temp, item, l;
scanf("%d%d", &n, &scope);
int squ[scope + 1]; // 将范围内的平方放在数组中
int sum[62501]; // 最大平方为 250 * 250
for(int i = 0; i <= scope; i++) {
squ[i] = i * i;
for(int j = i; j >= 0; j--) { // 将平方和下标的值置为1
temp = squ[i] + squ[j];
sum[temp] = 1;
}
}
l = 0;
for(int b = 1; b <= scope * scope; b++) { // 判断每项是否为平方和
// a 和 b 最大均可取得 scope * scope
for(int a = 0; a + (n - 1) * b <= scope * scope * 2; a++) {
for(int i = n - 1; i >= 0; i--) { // 从第一项到第n项
item = a + i * b;
if(sum[item] != 1) {
break;
}
if(i == 0) {
sure[l].a = a;
sure[l].b = b;
l++;
}
}
}
}
if(l == 0) {
printf("NONE\n");
} else {
for(int i = 0; i < l; i++) {
printf("%d %d\n", sure[i].a, sure[i].b);
}
}
return 0;
}
50 按要求输出序列
作者: 孙辞海 时间限制: 10S章节: 一维数组
问题描述 :
明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋,因此有意培养他对数学的兴趣。一次,明明的爸爸为了培养明明对数字的敏感,和明明玩起了一个数字游戏,这个游戏的名称叫“按要求输出序列”。在游戏中,明明的爸爸给了明明一串数字,要求明明首先把这串数字中重复出现的数字删除到仅剩一个,即相同的数字只保留一个,然后将这串数字从小到大进行排序。明明很快就理解了游戏的规则,开始玩起来。明明的爸爸首先给了明明三个数字:3、2、1;明明很快就回答说:“1、2、3”。明明的爸爸惊讶于明明的反应能力,开始加大游戏的难度,给出了由6个数字组成的数字串:2、1、4、3、5、2;明明眼珠子一转,脱口而出:“1、2、3、4、5”(由于“2”出现了两次,因此要删除一个,然后再排序输出。)。明明的爸爸意识到简单的数字串难不住明明,于是决定给出很长的一串数字串来考明明。但与此同时,明明爸爸面对这很长的数字串也无法一时计算出最后的结果,于是就求助于你,让你帮他写一个程序,用来计算出数字串最后的结果。
明明的爸爸的问题可以归结为:给你一个数字串,里面有n个数字,首先对数字串中的数字进行处理,删除重复出现的数字(重复出现的数字只保留一个),然后对数字串从小到大进行排序,最后输出排序后的字符串。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据占两行:
第一行是一个正整数n(1≤n≤200),表示数字串中有n个数字,
第二行是n个数字,n个数字都大于等于0且小于等于109,每两个数字用一个空格隔开。
每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个排序后的数字串,数字串中的数字用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
#include <stdio.h>
int main() {
int n;
while(scanf("%d", &n) != EOF) {
int temp[110] = {0};
int k, l;
int arr[n], newArr[n];
for(int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 将数组里存在的值放到对应的temp下标中
for(int i = 0; i < n; i++) {
temp[arr[i]] = 1;
}
// 查找temp中值为1的下标
for(k = 0, l = 0; k < 110 && l < n; k++) {
if(temp[k] == 1) {
newArr[l] = k;
l++;
}
}
for(int j = 0; j < l; j++) {
if(j > 0) printf(" ");
printf("%d", newArr[j]);
}
printf("\n");
}
return 0;
}
44 三艘船
作者: 朱星垠 时间限制: 10S章节: 一维数组
问题描述 :
明明由于工作的关系,经常需要坐船到某地出差办事。久而久之,明明就对这两地之间船的班次情况相当了解,他会根据办事的具体情况选择不同班次的船出行。这两地的船一共分为三个班次:特快船、快船、慢船,三个班次的船在同一天的0点从港口出发,并沿着同一路线匀速航行,只是它们到达目的地的时刻不同。 你作为明明的好朋友,有一次和明明在闲聊,问到他出差时船的航行距离有多少时,明明没有正面回答你这个问题,而只是把三艘船(特快、快、慢)的速度,以及它们到达目的地的时间是几点钟(并不知道分别是哪一天,只知道三艘船都在100天以内到达了终点)告诉了你,要你推算出两地间的距离长度。你作为一位程序设计专家,自然不会被明明的这个问题所难倒,于是你决定写一个程序,来求解这个看似困难其实简单的问题。 明明的问题可以归结为:给出三艘船的速度,以及它们到达目的地时是几点钟(并不知道分别是哪一天,只知道三艘船都在100天以内到达了终点),求两地间的距离到底有多少。若有多组解,只输出最小的那组解。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据占二行,第一行有3个正整数a、b、c,代表3艘船的到达港口那天的时间是几点钟(0≤a、b、c≤23)。第二行有3个正整数d、e、f代表3艘船的速度(0<d、e、f<30000),速度的单位是单位距离每小时。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果由一个整数构成,代表路程的长度,若有多组解,只输出最小的那组解。每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
#include <stdio.h>
int main() {
int a, b, c;
int ap, bp, cp;
int aL, bL, cL;
while(scanf("%d%d%d", &a, &b, &c) != EOF) {
scanf("%d%d%d", &ap, &bp, &cp);
aL = bL = cL = 0;
for(int i = 0; i <= 99; i++) {
if(c == 0) {
cL = 24 * (i + 1) * cp;
}else {
cL = (24 * i + c) * cp;
}
for(int j = 0; j <= 99; j++) {
if(b == 0) {
bL = 24 * (j + 1) * bp;
}else {
bL = (24 * j + b) * bp;
}
if(cL == bL) {
for(int m = 0; m <= 99; m++) {
if(a == 0) {
aL = 24 * (m + 1) * ap;
}else {
aL = (24 * m + a) * ap;
}
if(aL == bL) {
printf("%d\n", aL);
break;
}
}
if(cL == bL && bL == aL) break;
}
}
if(cL == aL && aL == bL) break;
}
}
return 0;
}
28 水果价格
作者: 朱星垠 时间限制: 1S章节: 循环
问题描述 :
一家水果店出售四种水果,每公斤价格的苹果(代码为a)1.5元,橘子(代码为o)1.4元,香蕉(代码为b)1.48元,菠萝(代码为p)1.08元。编一个程序,使售货员只要在键盘上打入货品的代码及重量,计算机将显示货品名、单价、重量及总价。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。
每组测试数据的第一行为一个整数m,表示有m件货品要被购买。在接下来的m行中,每行输入两个值d,g。d表示货品的代码,g表示重量。两组数据之间没有多余的空行。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。对应每组输入,输出货品名、单个总价及全部总价。具体格式参照样例输出:第一行apple前为7个空格,之后为2个空格,其他水果名后都是1个空格,sum后没有空格;第二行price后有2个空格,其后关于价格的表示多为占7格2位小数且左对齐,但其中pineapple为占10格2位小数且左对齐,注意sum的价格仍然占7格,如第一组样例中的54.60后还有2个空格;第三行weight后有1个空格,其后的数据与第二行一致。每两组数据之间有一个空行,最后一组测试数据之后没有空行。
输入范例 :
4
a 10
o 10
b 10
p 10
2
a 5.7
a 3.8
输出范例 :
#include <stdio.h>
int main() {
int m, num = 0;
float w, aPrice, oPrice, bPrice, pPrice, sumPrice;
float aWeight, oWeight, bWeight, pWeight, sumWeight;
while(scanf("%d", &m) != EOF) {
num++;
if(num > 1) {
printf("\n");
}
aPrice = 0.00;
oPrice = 0.00;
bPrice = 0.00;
pPrice = 0.00;
aWeight = oWeight = bWeight = pWeight = 0.00;
while(m--) {
char s[10];
scanf("%s %f", s, &w);
if(s[0] == 'a') {
aPrice += 1.5 * w;
aWeight += w;
}
if(s[0] == 'o') {
oPrice += 1.4 * w;
oWeight += w;
}
if(s[0] == 'b') {
bPrice += 1.48 * w;
bWeight += w;
}
if(s[0] == 'p') {
pPrice += 1.08 * w;
pWeight += w;
}
}
sumPrice = aPrice + oPrice + bPrice + pPrice;
sumWeight = aWeight + oWeight + bWeight + pWeight;
printf(" apple orange banana pineapple sum\n");
printf("price %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f\n", aPrice, oPrice, bPrice, pPrice, sumPrice);
printf("weight %-7.2f%-7.2f%-7.2f%-10.2f%-7.2f\n", aWeight, oWeight, bWeight, pWeight, sumWeight);
}
return 0;
}