需求:用随机数生成一篇除法练习题。要求能设定除数的位数,设定被除数的位数,商不能有余数。 400C

大家好,我想随机生成一些除法练习题,可以设置好除数的位数(如6位)、被除数的位数(如3位),商要求是不能有余数的,必须整除。
1. 质数只能被1和自身整除,我已经考虑到了。
2. 反着来,设置商和被除数的位数,也考虑过,这不符合要求。
希望大家能给一些可行的建议,或则现有的方案。谢谢,谢谢!

8个回答

最好是C#,C++都可以试试。谢谢

我建议写个小程序,for循环来做。比如 除数的位数(如6位) 从100001 到 900001 ,被除数的位数(如3位) 100到 999,最后判断商要求是不能有余数的:
for(i=100001;i<900001;i++){
for(j=100;i<999;j++){
k=i%j; 取余数

if(k==0){
保存该算式的 i j k
}
}
最后从所有可用的算式中,随机抽取一些算式

u010205572
春天生风 你好,谢谢建议,也这么考虑过,把所有符合的算式加到列表中,最后随机抽取显示到页面。但总觉得这是最后的方案,没有接触过算法之类的,不晓得有没有更好的方案。
3 年多之前 回复

首先定义变量除数位数cNum被除数位数bcNum
再定义总题数count,已生成题数getCount
写一个for循环,定义局部变量i为0 i小于count,且getCount小于等于count
在大的for循环里面写第一个小的for循环,用random每次生成一个10以内的随机数,转成字符串想加到cNum次,得到除数a,被除数的话再接着一个for循环,同得到除数方法一样,得到b。
然后进行模运算,a%b==0以这个为条件,复合条件的getCount加1,将除数和被除数中间用除号连接。如果有需要也可以用集合去存起来一样的。纯手机打的,不会的话在问我。

u011892089
llxiaoh 最后做除法运算的时候需要将字符串强转成int
3 年多之前 回复

大致理了一下思路:
1.以给出的除数位数,生成除数
2.以给出的被除数位数,生成被除数
3.两者进行除法运算
4.假设需要的整除组合 50对,那么进行一定数量的循环,直到达到50对此数字或者,循环结束为止。
5.最后得到所需的整出组合。

JAVA代码如下。。 C语言应该也能直接就翻译过去吧。。

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class TestCase {

    private static Set<String> set = new HashSet<String>();
    private static Random r = new Random();

    /**
     * 对数字进行运算,将符合要求的组合,存入set集合中
     */
    public static void CPNumber(long s, long z) {
        StringBuffer sb = new StringBuffer();
        // 生成除数
        long ss = randomS(s, r, sb);
        sb.delete(0, Integer.parseInt(ss + ""));
        // 生成被除数
        long zz = randomS(z, r, sb);
        // 求商
        long scz = ss / zz;
        // 求余数
        long syz = ss % zz;
        // 整出的同时必须满足,自身 、1必须除外
        if (syz == 0 && zz != ss && zz != 1) {
            System.out.println(ss + "÷" + zz + "=" + scz);
            // 将配对的 组合存入 Set集合中,防止重复
            set.add(ss + "÷" + zz + "=" + scz);
        }
    }

    // 随机组合出需要的作运算的数字
    public static long randomS(long s, Random r, StringBuffer sb) {
        /**
         * 有多少位,循环多少次
         */
        for (int i = 0; i < s; i++) {
            // 因为nextInt(9) 表示 0<=X<9 所以在第一次循环的时候逢0变成9,之后的循环无须
            if (i == 0) {
                int random = r.nextInt(9);
                // 除数以n打头
                int n = random == 0 ? 9 : random;
                sb.append(n);
            } else {
                sb.append(r.nextInt(9));
            }
        }
        // 最后返回需要的数字
        return Long.parseLong(sb.toString());
    }

    /**
     * 除数为s位,被除数为z位
     * size则表示需要得出多少个配对组合
     */
    public static void testCase(int s, int z, int size) {
        //被除数位数,不能大于除数位数
        if (z > s) {
            System.out.println("被除数位数不能大于除数");
            return;
        }
        //循环很多次,直到得出需要的组合数量,或者循环结束
        for (long i = 0; i < 1000000000; i++) {
            CPNumber(s, z);
            if (set.size() == size) {
                System.out.println(i);
                return;
            }
        }
    }
    public static void main(String[] args) {
        testCase(6, 5, 40);
        System.out.println(set);
    }

}

xiekuntarena
月明星稀灬 最大循环次数,这个还可以再优化优化
3 年多之前 回复

得出结果:图片说明

 1. 输入除数位数(1 - 10)被除数位数(1 - 10);

 2. 根据除数位数和被除数位数获取最大最小除数和最大最小被除数

 3.在最大最小被除数范围内随机一个被除数

 4. 分别用最大最小除数 除以被除数,获得一个商的范围

5.在商的范围内随机一个值。

    6. 这样商和被除数都有了,互乘就是除数。

帮你做一个网页版的怎么样,明儿差不多这个时候给你网址。

来一个项目的大纲。。完整的程序需要时间去写逻辑。。

 int main()
{
     1. 输入除数位数(1 - 10)被除数位数(1 - 10);

     2. 随机生成被除数(A) 随机生产倍数(B) 产生 A * B = (除数)C

     3.输出数据 C / A = ?

     4. 输入数据并判断数据的正确。。

    5.计算答题的得分等情况

    return 0;
}
shen_wei
shen_wei 东西都是活的,看你能需求,我这样写其实更好,方便以后扩展,或者你可以写死数据位数。。
3 年多之前 回复
u010205572
春天生风 回复人类新纪元开始了: 你好,您的方案是可以,但练习题可能针对的学生年龄不一样,所以才想控制除数和被除数的位数。按照您上面的方法,需要额外取设置商的位数,如果商是随机生成的,例如:被除数是3位,随机生成的商是4位,那么除数就非常大了。不符合要求。
3 年多之前 回复
shen_wei
shen_wei 列个大纲,你能看懂吧。。步骤就是这样,你可以试试写程序。。
3 年多之前 回复
u010205572
春天生风 。。。
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问