将字符数组用作整数
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^10long long
的上限约为 10^20(请参阅cplusplus.com/reference/climits)那么您为什么要经历这一切呢? (而不仅仅是使用long long n
和n%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 不会溢出 :) 因为这里的总和不会超过val
和 val
只是一个数字 :)
当您从数字构建号码时,我不明白为什么这是正确的。有什么解释吗?
@DrKoch 检查答案:)
嗯,我可以看到这对 n%5 是如何工作的,但对于 n%7 仍然看不到这个...为什么总是 (N/10)%7 == N%7持有?
这只是简单的数学划分。以上是关于将字符数组用作整数的主要内容,如果未能解决你的问题,请参考以下文章
cakephp 模型 saveAssociated 错误 - 不能将字符串偏移量用作数组