云计算百科
云计算领域专业知识百科平台

奇妙的比值、T的倍数N、三角形——day6

 问题1:     

        明明喜欢钻研各种各样的数学问题。一天,明明对数的因子产生了兴趣,他想把一个数的所有因子都找出来,然后把它们相加再去除以这个数,这样会得到一个比值。明明想看看不同的数的该比值会有什么不同,以便做研究。

        例如6这个数,它一共有4个因子,分别是:1、2、3、6,把他们相加然后再除以6,即1+2+3+6=12,12/6=2,就可以得到2这个比值。

        明明为了研究,需要得到大量的比值,但是如果通过手动计算比值的话需要花大量的时间,于是明明就想请你帮忙,帮他写一个程序,能够求数的比值。 明明的问题可以归结为:给你一个数,求所有因子和,把这些因子相加,然后再除以这个数,求得比值。(奇妙的比值)

输入、输出要求:

        你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤120),代表所求比值的那个数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

        对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个浮点数,就是所求的比值,保留2位小数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。(注:最后求得的比值保留2位小数。) 注:通常,显示屏为标准输出设备。

输入输出示例:

     

个人总结:

        1.本题相对简单,因子和需要用float或double类型存储,被除数与商的类型不同会导致错误;

        2.简化求数的因子时循环只需要到n/2;

实现代码如下示:

#include <stdio.h>
int main()
{
int n;
while (scanf("%d", &n)!= EOF)
{
double x=0,sum=0;
for (int j = 1; j <= n / 2; j++)
{
if ( n % j == 0 ) sum = sum +j;
}
sum=sum+n;
x=sum/n;//x=(double)sum/n;
printf("%.2f\\n",x);
}
return 0;
}

 问题2:     

          明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:“明明,你觉得你对数字敏感吗?”明明毫不犹豫地回答:“那当然,非常敏感。”于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。若我现在把自然数T告诉你,你能求出最小的符合条件的自然数N吗?” 明明觉得这个问题很简单,只要按从小到大的顺序把所有是7结尾的自然数找出来,然后交换位置,再除一下,看看倍数是不是T倍就可以了。明明回答爸爸说:“这个问题很简单,来考我吧。”于是明明的爸爸就给了明明一个数字2,让他开始动手寻找。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。他觉得靠手工查找的话,是无法快速找到的。因此,明明求助于你,请你帮他写一个程序,来解决这个相当棘手的问题。但是他也给了你另外一个条件,如果找到超过1000000时还是没有找到需要的那个数的话,就停止寻找。 明明的问题可以归结为:对于一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位,要求这样得到的一个新的数是原数的T倍。现给出这个自然数T,求满足这个要求的最小的自然数N。若在[1, 1000000] 的范围内没有找到N,则输出“No”。 (T的倍数N)      

输入、输出要求:

        你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个自然数T(1≤T≤9)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。        

        对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果输出一个自然数N或“No”,不包括双引号。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。

输入输出示例:

     

个人总结:

        1.本题难度适中,注意条件为个位数为7,那么只需要从7起,增量为10,直到1000000,实际是1000007为止,提高循环效率;

        2.本题中,最初我的逻辑出现一个错误:先判断j所存数字的位数后,再用7乘以10的位数次方加上j/10后存入sum,这样做会导致计算移位后数字的权重 i 时多乘了一次 10;

以 j=7(1 位数)为例:

  • 正确逻辑:把个位 7 移到最高位,结果还是 7 → sum = 7
  • 错误逻辑:循环执行 1 次,i=10 → sum=7*10 + 7/10 = 70 + 0 = 70这就导致当 T=1 时,70 != 1*7,明明符合条件的数被误判为不符合。

再以 j=179487(6 位数)为例:

  • 正确逻辑:把个位 7 移到最高位(6 位的最高位权重是 10^5=100000)→ sum=7*100000 + 179487/10 = 700000 + 17948 = 717948
  • 错误逻辑:循环执行 6 次,i=10^6=1000000 → sum=7*1000000 + 17948 = 7017948这就导致 7017948 != 4*179487,正确的数被误判为不符合。

错误逻辑:

int sum,i=1,k=j;
while(k>0){
k/=10;i*=10;
}
sum=7*i+j/10;

正确逻辑:

int sum, i = 1, k = j / 10;
while (k > 0) {
k /= 10;
i *= 10;
}
sum = 7 * i + j / 10;

        3.考虑到多组输出,需要在输出对应数字或未在范围内找到输出“No”后换行。

实现代码如下示:

#include <stdio.h>
#define Maxsize 1000000
int main()
{
int T;
while (scanf("%d", &T)!= EOF)
{
int j,sign=0;
for (j=7; j < Maxsize ; j=j+10)
{
int sum,i=1,k=j/10;
while(k>0){
k/=10;i*=10;
}
sum=7*i+j/10;
if ( sum == T*j){sign=1;printf("%d\\n",j);break;}
}
if(!sign){printf("No\\n");}
}
return 0;
}

 问题3:   

        “明明,你会用1到9这九个数字组成一个三角形吗?”明明的爸爸问明明。明明被问的很莫名其妙,不明白他爸爸在说什么,于是就问道:“用1到9组成三角形???”“是的,我的要求很简单,给你2个数,一个数作为这个三角形的开始,另一个数决定这个三角形的大小。例如我给你5和6这两个数,你就要组成如下的一个三角形:
5
6 7
8 9 1
2 3 4 5
6 7 8 9 1
2 3 4 5 6 7
明白了吗?”
        明明观察了许久,终于看出了门道来,说道:“就是说给我2个数,例如5和6,那我就要从5这个数开始构建一个三角形。第一行为一个数字,第二行为2个数字,以此类推,直到第六行的六个数字,且三角形中的数字都是1到9在循环重复,是这样吗?”“明明真聪明,就是这样。”明明爸爸高兴的说道。于是明明的爸爸给了明明很多组这样的数字,明明也构建出了很多个不同的三角形。
        你能像明明那样,写一个程序来构建上面的三角形吗?(三角形) 

输入、输出要求:

        你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有两个整数s和n(1≤s≤9,1≤n≤80),其中s表示位于三角形的最顶端的数字,n表示三角形由几行数字组成。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

        对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为构建出来的三角形,三角形中的同一行的数字两两之间用一个空格隔开。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。

注:通常,显示屏为标准输出设备。

输入输出示例:

  

个人总结:

        1.本题相对简单,关键在于如何控制输出数字后如何继续按照1-9的逻辑输出,如输入“8 2"需要输出:

8

9 1

即9回到1的转换,这里我采用(sign+1)%9的方法;

        2.本题多组输出涉及组内换行与组外换行。组内:观察可知当每行的单行输出数字与行数相等时需要换行。组外:采用定义一个标识 first_case 的方法;

int first_case = 1;
while (scanf("%d %d", &s, &n) != EOF) {
if (!first_case) {
printf("\\n");
}
first_case = 0;

实现代码如下示:

#include <stdio.h>
int main() {
int s, n;
int first_case = 1;
while (scanf("%d %d", &s, &n) != EOF) {
if (!first_case) {
printf("\\n");
}
first_case = 0;

int sign = s – 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
int num = sign + 1;
if (j == i) {
printf("%d\\n", num);
} else {
printf("%d ", num);
}
sign = (sign + 1) % 9;
}
}
}
return 0;
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » 奇妙的比值、T的倍数N、三角形——day6
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!