撰寫一個函式 remove_digits,它接收兩個 int 型別的陣列。第一個陣列包含許多整數,第二個陣列是一個數字陣列。有必要從第二個陣列中洗掉第一個陣列中存在的所有數字。
如果彈出成功,該函式回傳 1。如果彈出成功,該函式回傳 1,如果數字陣列由于某種原因不正確,如果陣列包含小于 0 或大于 9 的值,或者如果一個成員的重復。
示例 1:
int first[2]={12345, -12345},second[2]={3,5};
OUTPUT: 124 -124
示例 2:
int first[5]={25, 235, 1235, 252, 22552255},second[3]={2,3,5};
OUTPUT: 0 0 1 0 0
我的演算法:
- 檢查第二個陣列中的數字是否小于 0 或大于 9 或數字是否重復,在這種情況下回傳 0(完成程式)
- for 負數使它們為正,并在第一個(for)回圈結束時使它們為負
- 在第二個(while)回圈中將數字分解為數字,并為每個數字檢查它是否存在于第二個陣列中
- 如果存在,洗掉最后一個數字
- 繼續其余元素
代碼:
#include <stdio.h>
#include <stdlib.h>
int sum_of_digits(int n) {
int i, sum = 0;
while (n > 0) {
sum ;
n /= 10;
}
return sum;
}
int divide(int n) {
int num_of_digits = sum_of_digits(n);
switch (num_of_digits) {
case 1:
break;
case 2:
break;
case 3:
n /= 10;
break;
case 4:
n /= 100;
break;
case 5:
n /= 1000;
break;
case 6:
n /= 1000;
break;
case 7:
n /= 10000;
break;
case 8:
n /= 100000;
break;
case 9:
n /= 1000000;
default:
break;
}
return n;
}
int remove_digits(int *first, int n, int *second, int vel) {
// first - removing digits from second
// second - searching for digits
int i, j, num, digit, neg = 0;
for (i = 0; i < vel; i ) {
// invalid digit
if (second[i] < 0 || second[i] > 9)
return 0;
for (j = i 1; j < vel; j )
// repeated digit
if (second[j] == second[i])
return 0;
}
for (i = 0; i < n; i ) {
// negative case
if (first[i] < 0) {
first[i] = abs(first[i]);
neg = 1;
}
num = first[i];
while (num > 0) {
digit = num % 10;
for (j = 0; j < vel; j )
if (second[j] == digit)
// remove last digit
first[i] = divide(first[i]) - digit;
num /= 10;
}
if (first[i] <= 0)
first[i] = 0;
if (neg == 1)
first[i] *= -1;
}
return 1;
}
int main() {
int first[2] = {12345, 12345}, second[2] = {3, 5}, i;
remove_digits(first, 2, second, 2);
for (i = 0; i < 2; i )
printf("%d ", first[i]);
return 0;
}
我的輸出:4 4
你能幫我修改我的演算法以使其正常作業嗎?
uj5u.com熱心網友回復:
您的問題的簡化方法如下,
#include <stdio.h>
#include <stdlib.h>
int removeDigit(int src, int digit){
int neg = (src < 0)?-1:1;
int num = abs(src);
src = 0;
//remove digit
while(num){
int num_digit = num%10;
if(num_digit != digit){
src = src * 10 num_digit;
}
num /= 10;
}
//reverse number
while(src){
num = num * 10 src%10;
src /=10;
}
return num*neg;
}
int remove_digits(int *first, int n, int *second, int m) {
// first - removing digits from second
// second - searching for digits
int i, j;
for (i = 0; i < m; i ) {
// invalid digit
if (second[i] < 0 || second[i] > 9)
return 0;
for (j = i 1; j < m; j )
// repeated digit
if (second[j] == second[i])
return 0;
}
for (i = 0; i < n; i) {
for(j =0; j<m; j){
first[i]= removeDigit(first[i],second[j]);
}
}
return 1;
}
int main() {
{
printf("Test 1\n");
int first[] = {12345, 12345}, second[] = {3, 5}, i;
remove_digits(first, sizeof(first)/sizeof(first[0]), second, sizeof(second)/sizeof(second[0]));
for (i = 0; i < sizeof(first)/sizeof(first[0]); i )
printf("%d ", first[i]);
}
{
printf("\n\nTest 2\n");
int first[] = {25, 235, 1235, 252, 22552255}, second[] = {2,3,5}, i;
remove_digits(first, sizeof(first)/sizeof(first[0]), second, sizeof(second)/sizeof(second[0]));
for (i = 0; i < sizeof(first)/sizeof(first[0]); i )
printf("%d ", first[i]);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450305.html
