9907请你编程
大家好!“请你编程”又与你们见面了。“请你编程”得到了广大朋友的关心和支持,我在这里表示衷心的感谢。“请你编程”是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看本期辽宁读者张大鲲的程序。9907请你编程解题思路
要求完成地球数字与外星数字之间的转换功能,关键在于外星数字的进位问题,即给定一个合法的外星数字,如何利用一种规则, 产生出下一个合法的外星数字, 先假定这一问题已经解决, 那么:
1. 地球数字转换成外星数字: 若为一位数字, 则和外星数字相同; 若为2位或2位以上数字, 根据外星数字连续排列的特点, 地球数字与10的距离应该等于外星数字与10的距离, 也就说,地球数字X为10以后的第几个数字, 相应的外星数字X′也是10以后的第几个数字,因此只须确定出给定的地球数字与10之间的距离, 即可通过初值为10的外星数字求出下一个外星数字, 以及下一个的下一个数字, 直到距离相同为止, 便是所要求的X′。
2 .外星数字转换成地球数字: 若为一位数字, 则和地球数字相同, 若为2位或2位以上数字,同样, 只需确定出它与外星数字10的距离, 再加上10, 即为实际地球数字的值。
源程序
#include
#include
#include
char num[] = ″00000000000″; /* 最大数据不超过 9876543210\n */
void next_extra_num();
void change();
main()
{ FILE *fp1;
char temp[81], *p_comma;
int i, j, m, n;
int times, value, count;
fp1 = fopen(″ufo.txt″, ″r″);
if(fp1 == NULL) {printf(″File cannot open!\n″);
exit(0);}
fgets(temp, 80, fp1);
temp[strlen(temp)-1] = ′\0′;
p_comma = strchr(temp, ′,′); /* 指向字符 ″,″ */
*p_comma = ′\0′;
m = atoi(temp);
n = atoi(++p_comma);
i = 0;
while(!feof(fp1) && i < m)
{ fgets(num, 6, fp1);/* 最大合法数据为 ″1022\n\0″, 共 6 位 */
num[strlen(num)-1] = ′\0′;
if(strlen(num) == 1)
printf(″%s\n″, num); /*一位数字则直接输出*/
else {times = atoi(num)-10; /* 确定与10的距离, 即调用函数须循环的次数 */
num[0] = ′1′;
num[1] = ′0′;
num[2] = ′\0′;
for(j = 0; j < times; j++)
next_extra_num();
printf(″%s\n″, num);}
i++;}
i = 0;
while(!feof(fp1) && i < n)
{fgets(num, 12, fp1);
num[strlen(num)-1] = ′\0′;
if(strlen(num) == 1)
printf(″%s\n″, num);/*直接输出一位数字*/
else {value = atoi(num); /*保留输入的原值*/
num[0] = ′1′;
num[1] = ′0′;
num[2] = ′\0′;
count = 0;
while(atoi(num) != value) {next_extra_num();
count++;/* 确定与10的距离 */}
printf(″%d\n″, count+10);}
i++;}
fclose(fp1);}
void next_extra_num()
{ int length, i; /* 数组的长度 */
length = strlen(num);
num[length-1]++; /* 计算下一个数字 */
while(!order_or_not(length))
for(i = length-1; i > 0; i--)
change(i, &length); /*按照规则修改数字*/}
order_or_not(length) /*是否排序*/
int length;
{int i;
for(i = 0; i < length; i++)
if(num[i] <= num[i+1])
return(0); /*返回 0 值*/
return(1);}
void change(i,p_length)
int i, *p_length;
{ int j;
if(num[i] == num[i-1] )
{num[i] = ′0′; /* 后一位变成 0, 并进位 */
num[i-1]++;/* 进位加 1 */}
if(num[i-1] < num[i])
num[i-1] = num[i]+1;/* 新值等于后一个数字的值加 1 */
if(num[i-1] == ′9′+1)
{ for(j = *p_length; j >= 0; j--)
num[j+1] = num[j];
num[0] = ′1′;/*把它变为 10, 同时 */
num[1] = ′0′;
(*p_length)++; /* 改变数组的长度 */}}
9909请你编程题目
在2099年,举行了第N届地球小姐的选美大赛。各国佳丽云集桃花岛,角逐第N届地球小姐的称号。评选的时候,这些美眉站成一个M*N的一个矩阵,由评委给她们打分。这个分数为一个整数,最小为-100,最大为+100。可以很容易根据分数评选出冠军。但在这之后,赛会还要评选出一组团体冠军。
评选要求为两点:
1.这组团体冠军必须为大的M*N矩阵中的一个X*Y的小矩阵。X、Y可以为1。
2.M*N矩阵中的任一子矩阵都称为一个″团体″,这组团体冠军的总分必须为所有的″团体″总分中最大的。
例如:有一个3*3的矩阵:
1 2 3
2 3 4
9 -99 10
最大的子矩阵为3 4 10,她们的总分为17。所以,团体冠军的总分就为17。
现在就请你编一个程序,选出团体冠军,要求如下:
1.输入从文本文件beauty.txt中读入。格式为:第一行为一个正整数C,表示共有C组输入数据。每组输入数据格式为:第一行为两个正整数M、N,表示美眉们站成一个M*N的矩阵。以下为M行,每行N个整数,表示各位美眉的分数。整数之间用空格分开。其中2<=M、N<=100、C<=10。
2.输出到屏幕上,共C行,每行5个整数:X1、Y1、X2、Y2、SCORE,其中X1、Y1、X2、Y2表示团体冠军的位置,SCORE表示团体冠军的分数。如果有多个团体冠军并列,只需要输出其中一组即可,整数之间用空格分开。
输入范例:
1
3 3
1 2 3
2 3 4
9 -99 10
输出范例:
1 3 3 3 17
本期题目由上海的oldbug提供。
来稿请寄磁盘稿或用E-mail投稿,请写明解题思路和源程序(包含详细的注解),将来稿寄到电脑报编辑部的收信地址或E-mail信箱,同时欢迎提供请你编程的题目。来稿截止日期:1999年9月15日。
本期获奖者名单
王春新(湖北) 马拥军(浙江)
付永安(杭州) 陈行辉(广西)
李进新(上海) 张玉源(重庆)
杨大成(内蒙) 杨 莉(天津)
田安奎(重庆) 张啸清(云南)
每位获奖者将获得苦丁香公司提供的光盘一张。