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。
上述代码的任何改进也将受到赞赏.....:)
答案 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 :)