zoukankan      html  css  js  c++  java
  • 1074 宇宙无敌加法器 (20分)C语言

    地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。

    在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201。

    输入格式:
    输入首先在第一行给出一个 N 位的进制表(0 < N ≤ 20),以回车结束。 随后两行,每行给出一个不超过 N 位的非负的 PAT 数。

    输出格式:
    在一行中输出两个 PAT 数之和。

    输入样例:

    30527
    06203
    415
    

    输出样例:

    7201
    

    思路

    • STEP1:定义四个数组

      • A[]:被加数A,a:数组下标,初始指向数组最高位;
      • B[]:被加数B,b:数组下标,初始指向数组最高位;
      • M[]:进制数组,m:数组下标,初始指向数组最高位;
      • s[]:存放结果,初始为0,t:数组下标,初始为0;
    • STEP2:循环计算

      • 设有:
      • 被加数1:n1;A[]中仍有数:取A[a] ;A[]中无数:取0;
      • 被加数2:n2;B[]中仍有数:取B[b] ;B[]中无数:取0;
      • 该位进制:d;M[]中无数,或为0 :取10 ;否则取M[m];
      • 由此得到公式:
      • 相加结果,进位后剩余的数:s[t] = ( s[t] + n1 + n2 ) % d ;
      • 相加结果,进位的数:s[t+1] = ( s[t] + n1 + n2 ) / d ;
    • STEP3:舍去多余的0并输出结果

    #include <stdio.h>
    int main(){
    	char m[20],a[20],b[20];
    	int arr[20]={0},s=0;//存放最终结果
    	scanf("%s %s %s",m,a,b);
    	int c=strlen(a)-1;//从各数组高位开始计算
    	int d=strlen(b)-1;//c为被加数 数组a[]的下标指针
    	int e=strlen(m)-1;//同理:b-B[],m-M[];
    	int n1,n2,h;
    	for(;c>=0||d>=0;s++,c--,d--,e--){//循环至两个被加数组中都没有未处理元素为止;
    		n1= (c>=0) ? a[c]-'0':0;//被加数1 若a[]中的数都已处理完,被加数1则为0;
    		n2= (d>=0) ? b[d]-'0':0;//被加数2 若b[]中的数都已处理完,被加数2则为0;
    		h= (e<0 || m[e]=='0') ? 10 : m[e]-'0';//进制 m[e]为0时,或m[]中数都已处理完,h为10进制;
    		arr[s+1] = (arr[s]+n1+n2)/h;//赋值 
    		arr[s] = (arr[s]+n1+n2)%h;//赋值 
    	}
    	while( !arr[s] && s>0)	s--;//舍去多余的0 
    	while( s> -1)	printf("%d",arr[s--]); //输出 
    	return 0;
    }
    

    参考博文

    欢迎查阅
  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/gh110/p/12158166.html
Copyright © 2011-2022 走看看