一、數位拆解
- 題目描述
寫個算法,對2個小于1000000000的輸入,求結果。 特殊乘法舉例:123 * 45 = 14 +15 +24 +25 +34+35
- 輸入描述
兩個小于1000000000的數
- 輸出描述
輸入可能有多組數據,對于每一組數據,輸出Input中的兩個數按照題目要求的方法進行運算后得到的結果。
- 示例輸入
123 45
- 示例輸出
54
代碼8.1.1 求余取模,除10移位
#include <stdio.h>
int main(){
int a, b;
while(scanf("%d %d",&a, &b) != EOF)
{
int buf1[20], buf2[20]; //暫存數位拆解出來的數
int i = 0, j = 0, s = 0;
while(a > 0)
{
buf1[i++] = a % 10;
a /= 10;
}
while(b > 0)
{
buf2[j++] = b % 10;
b /= 10;
}
for( int m = 0; m < i; m++)
{
for(int n = 0; n < j; n++)
{
s += buf1[m] * buf2[n];
}
}
printf("%d\n", s);
}
return 0;
}
8.1.2 存為字符串
#include <stdio.h>
int main(){
char a[11], b[11]; //利用字符串讀入
while(scanf("%s%s",a,b) != EOF)
{
int s = 0;
for( int m = 0; a[m] != 0; m++)
{
for(int n = 0; b[n] != 0; n++)
{
//字符與字符'0'ASCII值的差為字符對應的數字
s += (a[m] - '0') * (b[n] - '0');
}
}
printf("%d\n", s);
}
return 0;
}
二、進制轉換
- 題目描述
輸入兩個不超過整型定義的非負10進制整數A和B(<=231-1),輸出A+B的m (1 < m <10)進制數。
- 輸入描述
輸入格式:測試輸入包含若干測試用例。每個測試用例占一行,給出m和A,B的值。
當m為0時輸入結束。
- 輸出描述
輸出格式:每個測試用例的輸出占一行,輸出A+B的m進制數。
- 示例輸入
8 1300 48
2 1 7
0
- 示例輸出
2504
1000
代碼8.2
#include <stdio.h>
int main()
{
long long a, b; //確保不會溢出
int m;
while(scanf("%d", &m) != EOF)
{
if(m == 0) break;
scanf("%lld%lld", &a, &b);
a = a + b; //先求和
//轉為m進制數
int s[50], i = 0;
do{
s[i++] = a % m;
a /= m;
}while(a != 0); //即使a=0也至少會執行一次do
for(int j = i - 1; j >= 0; j--)
{
printf("%d",s[j]); //順序逆過來,高位到低位
}
printf("\n");
}
return 0;
}