判断一个除数是否能除尽

/**
 *
 * @author wll
 * @date 2009/12/12
 */
public class SB {

 

 public static void main(String[] args) {  
  System.out.println((double) (3/8.0));
  System.out.println(fun(1, 7));
  System.out.println(fun(3,8));
 }

 /**
  * char *fun(unsigned i, unsigned j)如果i能除得尽j,就返回NULL
  * 否则,如果除不尽就返回指向它的循环数字的指针,空间在该函数中分配 比如1/7 =
  * 0.14285714285714285714285714285714将返回指向"142857"的指针, 1/2 = 0.5将返回NULL
  */

 public static String fun(int i, int j) {
  StringBuffer sb = new StringBuffer();
  int t = i;
  //存放除法所得的商
  int[] div = new int[100];
  //存放除法所得的余数
  int[] mod = new int[100];
  int d = 0, di = 0;
  int index = -1;
  //如果能够整除,就返回“NULL”
  if(i%j==0)
   return "NULL";
  //否则,将i变为小于j的数
  if (i > j) {
   i = i % j;
   t = i;
  }

  //第一个余数为数i%j
  mod[d++] = t;
  while (i < j) {
   i = i * 10;
   if (i < j) {
    div[di++] = 0;
    mod[d++] = i;
   }
  }
  //此时i大于j,k为余数,m为商
  int k, m;
  
  do {
   k = i % j;
   m = i / j;
   div[di++] = m;
   index = tx(k, mod);
   //如果k在mod数组中,结束循环
   if (index != -1) {
    break;
   }
   //将k加入数组
   mod[d++] = k;
   i = k * 10;
   m = i / j;
   k = i % j;
   //System.out.println("index:" + index);

   //余数为0,说明可以除尽
   if (k == 0)
    return "NULL";

  } while (index == -1);

  for (int mm = index; mm < di; mm++) {
   //System.out.println("xx" + div[mm]);
   sb.append(div[mm]);
  }
  return sb.toString();

 }

 //判断数k是否在数组中,若是,返回下标i,否则,返回-1.
 private static int tx(int k, int[] mod) {
  // TODO Auto-generated method stub
  for (int i = 0; i < mod.length; i++) {
   if (k == mod[i])
    return i;
  }
  return -1;
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C 语言中,你可以使用以下方法来编写函数 selfDivisor() 判断 num 是否为自除数: int selfDivisor(int num) { int n = num; while (n > 0) { int digit = n % 10; if (digit == 0 || num % digit != 0) { return 0; } n /= 10; } return 1; } 然后你可以使用该函数来输出不大于 N 的所有自除数: #include <stdio.h> int main() { int N; printf("请输入 N 的值:"); scanf("%d", &N); for (int i = 1; i <= N; i++) { if (selfDivisor(i)) { printf("%d ", i); } } return 0; } 希望这对你有帮助! ### 回答2: 题目要求编写一个判断一个数是否为自除数的函数selfDivisor(num),然后输出不大于N的所有自除数。 首先,我们可以编写一个函数isSelfDivisor(num)来判断一个数是否为自除数。 该函数的实现思路如下: 1. 将num保存到另一个变量temp中,用于后续计算。 2. 对temp进行取余操作(temp % 10)得到temp的最后一位数字。 3. 判断temp的最后一位是否为0,如果是,则返回0,表示num不是自除数。 4. 判断num是否能被temp的最后一位整除,如果不能整除,则返回0,表示num不是自除数。 5. 将temp右移一位(temp = temp / 10),即去掉temp的最后一位。 6. 重复步骤2-5,直到temp为0。 7. 如果上述判断过程中没有返回0,则返回1,表示num是自除数。 然后,我们可以编写函数selfDivisor(num)来输出不大于N的所有自除数。 该函数的实现思路如下: 1. 使用一个循环,从1到N遍历每个数。 2. 对于每个遍历到的数,使用isSelfDivisor函数判断是否为自除数。 3. 如果判断结果为1,表示是自除数,则输出该数。 下面是函数的具体实现代码: ```c #include <stdio.h> int isSelfDivisor(int num) { int temp = num; while (temp != 0) { int digit = temp % 10; if (digit == 0 || num % digit != 0) { return 0; // 不是自除数 } temp /= 10; } return 1; // 是自除数 } void selfDivisor(int N) { for (int i = 1; i <= N; i++) { if (isSelfDivisor(i)) { printf("%d ", i); } } printf("\n"); } int main() { int N; printf("请输入一个正整数N:"); scanf("%d", &N); selfDivisor(N); return 0; } ``` 运行程序后,输入一个正整数N,程序将输出不大于N的所有自除数。 ### 回答3: 要编写一个函数判断一个数是否为自除数,可以按照以下步骤进行: 1.编写一个helper函数checkDivisor,用于判断一个数是否能够被其每一位除尽。 2.在checkDivisor函数中,先将num转换为字符串,然后遍历每一位数字,依次用每一位数字去除以num,如果出现不能整除的情况,则返回0;若全部能整除,则返回1。 3.编写主函数selfDivisor,在该函数中使用一个循环,从1到N逐个判断是否为自除数,并按要求输出结果。 以下是具体实现的示例代码: ```c #include <stdio.h> #include <stdlib.h> int checkDivisor(int num) { char str[10]; // 假设num为10位数 sprintf(str, "%d", num);// 将num转换为字符串 int i, digit; for(i = 0; i < 10; i++) { if(str[i] == '\0') break; // 到达字符串结尾,结束循环 digit = str[i] - '0'; // 将字符数字转换为整数 if(digit == 0 || num % digit != 0) return 0; // 出现不能整除的情况,返回0 } return 1; // 能被每一位整除,返回1 } void selfDivisor(int N) { int i; for(i = 1; i <= N; i++) { if(checkDivisor(i)) printf("%d ", i); // 如果i是自除数,则输出 } } int main() { int N; printf("请输入一个正整数N: "); scanf("%d", &N); printf("不大于%d的所有自除数为:", N); selfDivisor(N); return 0; } ``` 通过调用selfDivisor函数,即可输出不大于N的所有自除数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值