PAT Basic 1101. B是A的多少倍

发布时间 2023-04-16 10:48:13作者: 十豆加日月

PAT Basic 1101. B是A的多少倍

1. 题目描述:

设一个数 \(A\) 的最低 \(D\) 位形成的数是 \(a_d\)。如果把 \(a_d\) 截下来移到 \(A\) 的最高位前面,就形成了一个新的数 \(B\)\(B\) 是 \(A\) 的多少倍?例如将 12345 的最低 2 位 45 截下来放到 123 的前面,就得到 45123,它约是 12345 的 3.66 倍。

2. 输入格式:

输入在一行中给出一个正整数 \(A\)\(≤10^9\))和要截取的位数 \(D\)。题目保证 \(D\) 不超过 \(A\) 的总位数。

3. 输出格式:

计算 \(B\) 是 \(A\) 的多少倍,输出小数点后 2 位。

4. 输入样例:

12345 2
12345 5

5. 输出样例:

3.66
1.00

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

回血题,根据题意把正整数\(A\)\(B\)算出来即可,实际上就是找出十进制数各位的正确权重。这里因为正整数\(A\)最大为\(10^9\),那么相应的\(B\)也存在上界\(10^9\),不用担心int类型存不下。

My Code:

#include <stdio.h>
#include <string.h> // strlen header
#include <math.h> // pow header

int main(void)
{
    char num[11] = "";
    int numA=0, numB=0;
    int d=0;
    int weight=0; // weight of every bit
    int i=0; // iterator
    int numLen = 0;
    
    scanf("%s%d", num, &d);
    numLen = strlen(num);
    //printf("numLen: %d\n", numLen);
    
    weight = numLen-1;
    for(i=0; i<numLen; ++i)
    {
        numA += pow(10, weight) * (num[i]-'0');
        --weight;
    }
    
    weight = numLen-1;
    i = numLen - d;
    while(weight>=0)
    {
        numB += pow(10, weight) * (num[i]-'0');
        --weight;
        ++i;
        if(i==numLen) i=0;
    }
    
    //printf("%d %d\n", numA, numB);
    printf("%.2f\n", numB*1.0/numA);
    
    return 0;
}