如何用C语言划分数字并比较它们
编写一个程序,找出小于N的最大数字,它与给定的数字X完全不同。只有当一个数字不包含另一个数字的任何数字时,它才与另一个数字完全不同。N和X从标准输入读取。这个问题应该在不使用数组的情况下解决 示例输入1:400 897 示例输出1:366 输入示例2:1000 1236498 示例输出2:777 不,那不是家庭作业,那是在一次期中考试,它一直在折磨着我。我想先用%10取第一个数字最后一个数字,然后用%10取第二个数字比较它们,但是…我就是无法让它工作…我最终陷入了一个无休止的循环…我只是不知道如何获取数字的每个数字并将其与另一个数字进行比较如何用C语言划分数字并比较它们,c,C,编写一个程序,找出小于N的最大数字,它与给定的数字X完全不同。只有当一个数字不包含另一个数字的任何数字时,它才与另一个数字完全不同。N和X从标准输入读取。这个问题应该在不使用数组的情况下解决 示例输入1:400 897 示例输出1:366 输入示例2:1000 1236498 示例输出2:777 不,那不是家庭作业,那是在一次期中考试,它一直在折磨着我。我想先用%10取第一个数字最后一个数字,然后用%10取第二个数字比较它们,但是…我就是无法让它工作…我最终陷入了一个无休止的循环…我只是不知道如
#include <stdio.h>
int main () {
int N, X, num_N, num_X, i, lastDigit_N, lastDigit_X, flag, smaller_than_N;
scanf("%d%d", &N, &X);
smaller_than_N = N - 1;
for (i = smaller_than_N; i > 0; i--) {
num_N = i;
num_X = X;
flag = 0;
while (num_N > 0) {
lastDigit_N = num_N % 10;
while (num_X > 0) {
lastDigit_X = num_X % 10;
if (lastDigit_N == lastDigit_X) {
break;
}
else {
flag = 1;
}
num_X /= 10;
}
num_N /= 10;
}
if(flag) {
printf("%d", i);
break;
}
}
return 0;
}
#包括
int main(){
int N,X,num\u N,num\u X,i,lastdigital\u N,lastdigital\u X,flag,小于\u N;
scanf(“%d%d”、&N和&X);
小于N=N-1;
对于(i=小于;i>0;i--){
num_N=i;
num_X=X;
flag=0;
而(数值>0){
lastDigit\u N=num\u N%10;
而(num_X>0){
lastDigit\u X=num\u X%10;
如果(lastDigit\u N==lastDigit\u X){
打破
}
否则{
flag=1;
}
num_X/=10;
}
num_N/=10;
}
国际单项体育联合会(旗){
printf(“%d”,i);
打破
}
}
返回0;
}
您可以为数字构建一个位掩码,显示包含的数字
uint16_t num2bitmask(int number)
{
uint16_t result = 0;
while (number) {
int digit = number % 10;
number /= 10;
result |= (1 << digit);
}
return result;
}
uint16\u t num2位掩码(整数)
{
uint16_t结果=0;
while(数字){
整数位数=数字%10;
数目/=10;
结果|=(1如果您有一个带有数字d_1、d_2、…、d_n的数字,并且允许您使用集合d中的数字,那么可能的解决方案如下所示:
d_1, ..., d_{i-1}, max(d in D | d < d_i), max(d in D), ..., max(d in D).
d_1,…,d_{i-1},max(d在d|d
也就是说,数字在某一点上是相同的,然后下一个数字在低于输入数字时尽可能大,然后其余数字尽可能大
并非所有这些“解决方案”都是有效的,但如果您以相反的顺序遍历它们(大小为n的输入数正好是n),您找到的第一个有效的解决方案就是答案
一些代码,包括测试:
#include <stdio.h>
int digit_length(int a) {
int r = 0;
while (a) {
a /= 10;
r += 1;
}
return r;
}
int get_digit(int a, int k) {
while (k--) a /= 10;
return a % 10;
}
int largest_different(int a, int b) {
int lena = digit_length(a);
int invalid = b ? 0 : 1;
for (; b; b /= 10) invalid |= 1 << (b % 10);
int max_valid = 9;
while (max_valid >= 0 && (invalid & (1 << max_valid)))
max_valid--;
if (max_valid == -1) return -1;
for (int i = 0; i < lena; i++) {
int d = get_digit(a, i) - 1;
while (d >= 0 && (invalid & (1 << d)))d--;
if (d < 0) continue;
int solution = 0;
for (int k = lena - 1; k >= 0; k--) {
solution *= 10;
solution += (k < i ? max_valid : k > i ? get_digit(a, k) : d);
}
return solution;
}
return -1;
}
int main(int argc, char *argv[]) {
struct {int n; int x; int want;} examples[] = {
{400, 897, 366},
{1000, 1236498, 777},
{998, 123, 997},
};
int error = 0;
for (int i = 0; i < sizeof(examples) / sizeof(*examples); i++) {
int got = largest_different(examples[i].n, examples[i].x);
if (got != examples[i].want) {
error = 1;
printf("largest_different(%d, %d) = %d, want %d\n",
examples[i].n, examples[i].x, got, examples[i].want);
}
}
return error;
}
#包括
整数位数长度(整数a){
int r=0;
while(a){
a/=10;
r+=1;
}
返回r;
}
int get_数字(int a,int k){
而(k--)a/=10;
返回%10;
}
int最大值_不同(int a,int b){
int lena=数字长度(a);
int invalid=b?0:1;
对于(;b;b/=10)无效的|=1=0&&(无效的&(1=0&&)(无效的&(1=0;k--){
溶液*=10;
解+=(ki?get_位(a,k):d);
}
回流液;
}
返回-1;
}
int main(int argc,char*argv[]){
结构{int n;int x;int want;}示例[]={
{400, 897, 366},
{1000, 1236498, 777},
{998, 123, 997},
};
整数误差=0;
对于(int i=0;i
不总是有解决方案。在这种情况下,函数返回-1。您可以使用for
循环从0迭代到N。在调试器中逐行检查代码,同时检查所有变量值。使用它可能更容易。@ElliottFrisch您知道我完全忘记了awesome:D这个词,谢谢:DWhy'Example Output 1'不是366吗?好主意!@College19:一旦你在迭代时为另一个数字构建了bismask,你就可以&
它们,并检查结果是否是0
,如果是,你找到了一个与另一个数字“完全不同”的数字。@glglglgl如果我知道怎么做,我会的,他们不会在我的同事那里教sht哦,嘿,这些是变量,这些是数组,也可以是矩阵,你自己去弄清楚整个语言和它的功能。谢谢,不过我要看看什么是位掩码以及如何使用它:D