将字符数组用作整数

Posted

技术标签:

【中文标题】将字符数组用作整数【英文标题】:Using the character array as integers 【发布时间】:2015-04-06 11:29:55 【问题描述】:

大家好,我正在尝试解决黑客排名中给出的一个问题。虽然问题很简单,但我正在考虑使用其他一些概念来解决问题。

问题是

说明

给你一个整数 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 建议将有所帮助,这也是解决问题的更好方法,这种方式变量 N被声明为字符数组或通过将变量 N​​ 声明为 long long。

对上述代码的任何改进也将不胜感激.....:)

【问题讨论】:

修复你的格式,眼睛很痛 N 的上限是多少? N 的上限为 10^10 long long 的上限约为 10^20(请参阅cplusplus.com/reference/climits)那么您为什么要经历这一切呢? (而不仅仅是使用long long nn%digit == 0 只是用其他一些逻辑来解决问题,我想这在复杂性 rt 方面是更有效的方法? 【参考方案1】:

这个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;
    

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

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

#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 :)

【讨论】:

sum 不会溢出 :) 因为这里的总和不会超过 valval 只是一个数字 :) 当您从数字构建号码时,我不明白为什么这是正确的。有什么解释吗? @DrKoch 检查答案:) 嗯,我可以看到这对 n%5 是如何工作的,但对于 n%7 仍然看不到这个...为什么总是 (N/10)%7 == N%7持有? 这只是简单的数学划分。

以上是关于将字符数组用作整数的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 模型 saveAssociated 错误 - 不能将字符串偏移量用作数组

将char数组转换为字符串并将其用作标签文本[重复]

C#如何将变量用作键值字符串数组的对象列表对象构造函数中的属性名称

将字符串数组转换为整数数组

C语言,整数数组转化为字符串

TS:整数、字符串、数组之间的转换