使用字符数组作为整数

时间:2015-04-06 11:29:55

标签: c arrays string long-integer integer-division

Hello Guys我正在尝试解决Hacker Rank上给出的一个问题。虽然问题很简单,但我正在考虑使用其他一些概念来解决问题。

问题是

Desription

给定一个整数N.找到这个数字中准确除以N的数字(除以0作为余数)并显示它们的计数。对于N = 24,有2位数(2和4)。这两个数字都完全除以24.所以我们的答案是2。

输入格式

第一行包含T(测试用例数),后跟T行(每行包含一个整数N)。

约束 1≤T≤15 0

我之前通过将变量N定义为long long类型来解决问题,但我认为这不是解决问题的有效方法。 所以我想为什么不将变量N声明为字符数组。这样我们还可以使用程序存储的数字大于long long的最大限制也是rt?

假设我使用了以下代码

#include <stdio.h>
#include <string.h>
int main()
{
    int i,t;
    char n[20];
    scanf("%d",&t);
    while(t--)
    {    
        scanf("%s",n);
       int len=strlen(n);
       int f2,f3,f5,f7,f4,count;
         f2=f3=f5=f7=f4=count=0;
      for( i=0;i<len;++i)
     { int sum=0;
         switch((int)n[i])
         {
             case 48: break;
             case 49: ++count;break;
             case 50: if((int)n[len-1]%2==0)      // divisibility by 2
                      { 
                         ++count;f2=1;
                      }break;
             case 51:  for(i=0;n[i]!='\0';++i)    // divisibility by 3
                     {
                         sum+=(int)n[i];
                     }
                     if(sum%3==0)
                    {
                          ++count;
                         f3=1;
                     }break;
            case 52: if(f2==1)             // divisibility by 4
                     {
                        ++count;
                        f4=1;
                    }    break;
            case 53: if(n[len-1]=='5' || n[len-1]=='0')    // divisibility by 5
                     {
                         ++count;
                         f5=1;
                     }break;
            case 54: if(f2==1 && f3==1)         // divisibility by 6
                     {
                         ++count;
                         break;
                     }  
             case 55: // Code for divisibilty by 7
            case 56: if(f2==1 && f4==1)    // divisibility by 8
                     {    ++count;
                          break;
                     }
            case 57: if(f3==1)       // divisibility by 9
                    { 
                        ++count;
                        break;
                    }    
        }

    }

    printf("%d\n",count);
    }
    return 0;
}

该程序工作正常,但唯一的问题是我不能通过7个anu建议将rt代码用于解决问题会有所帮助,而且这也是解决问题的更好方法,这种变量N的方式声明为字符数组或通过将变量N声明为long long。

上述代码的任何改进也将受到赞赏.....:)

1 个答案:

答案 0 :(得分:0)

可以通过rule

检查7的可分性

此外,您可以使用此mod()函数按任意数字检查可分性:

    int mod(char *n, int val)
    {
        int sum = 0;
        for(int i=0; n[i]; i++)
        {
            sum = sum*10 + (n[i]-'0');
            if(sum >= val)
              sum = sum % val;
        }
        return sum;
    }

如果数字0可以被数字n整除,它将返回val:)

而且您不需要检查每个冗余数字 首先检查可用数字,然后检查每个数字的可分性 这是你可以做的 -

#include <stdio.h>
#include <string.h>
int mod(char *n, int val)
{
    int sum = 0;
    for(int i=0; n[i]; i++)
    {
        sum = sum*10 + (n[i]-'0');
        if(sum >= val)
          sum = sum % val;
    }
    return sum;
}
int main()
{
    int i,t;
    int digit[10];
    char n[20];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",n);
        int len=strlen(n);
        int cnt=0;
        memset(digit,0,sizeof(digit)); // setting all the digit to 0
        for(i=0;i<len;i++)
          digit[n[i]-'0']++;
        for(i=1;i<10;i++)
        {
            if(digit[i]==0) // number doesn't contain any of this digit
              continue;
            if(mod(n,i)==0)
                cnt+=digit[i]; // Adding the digit to the answer
        }
        printf("%d\n",cnt);
    }
    return 0;
}

这是如何运作的:

for n = 147 and val = 7
sum = 0

1st iter >> sum = 0*10 + 1 = 1
sum < val, so continue

2nd iter >> sum = 1*10 + 4 = 14
sum >= val, so sum = sum % val = 14 % 7 = 0

3rd iter >> sum = 0*10 + 7 = 7
sum >= val, so sum = sum % val = 7 % 7 = 0

as the final sum is 0, so we can say that n is divisible by val :)