# فناوری جاوا > برنامه‌نویسی جاوا > Java SE : نگارش استاندارد جاوا >  جواب سوالات مسابقات جاوا کاپ در سایت Quera

## farhad_shiri_ex

نمی دونم چند درصد از برنامه نویسان این تالار تو مسابقات جاوا کاپ شرکت میکنند ولی یکسری مسابقات تستی هم داره که میتونین شرکت کنین خیلی خوب قدرت الگوریتم نویسی رو بالا میبره 
خودم برای شروع دوتا از سوال هاشو که با روش خودم نوشتم میذارم خوشحال میشم دوستان نظر بدن ویا اگر بدرد شو خورد بهم بگه ممنون میشم
البته خیلی خیلی ساده هستند.
با تشکر
اعداد کامل کوچکتر از ۱۰,۰۰۰ 

public class CompleteNumber {

    private static int sNum = 0 , cnt = 0;
    private static Function<Integer , Boolean> sumFunc = FuncProc::sumNumber;
    private static BiFunction<Integer,Integer,Boolean> mod = FuncProc::mod;

    public static void main(String[] args) {
        Consumer<Integer> cOut = System.out::println;

        for (int i = 2; i < 10000; i++) {
            if(sumFunc.apply(i)) cOut.accept(i);
            sNum = 0; cnt = 0 ;
        }

    }

   @Test
    public void test1() {
        assertEquals(sumFunc.apply(8),false);
        assertEquals(sumFunc.apply(6),true);
        assertEquals(sumFunc.apply(28),true);
    }
    private static class FuncProc {
        //for loop algorithm
        private static boolean sumNumber(int arg) {
            int sNum = 0;
            for (int i = 1; i < arg; i++) {
                sNum += mod.apply(arg,i) ? i : 0;
            }
            return sNum == arg ;
        }

        //recursive algorithm
        private static boolean sumNumber2(int arg) {
            int i = (++cnt - arg + arg);
            if(sNum== arg
                    && i >= arg)
                return true;
            else if(sNum > arg)
                return false;
            sNum += mod.apply(arg,i) ? i : 0;
            return sumFunc.apply(arg);
        }

        private static boolean mod(int a , int b) {
            return a % b == 0 ;
        }
    }

اگر نخواستید متیونید Test هاشو غیر فعال کنید

----------


## farhad_shiri_ex

تعداد دفعات تکرار رشته‌ی دوم در رشته‌ی اول
البته من با روش Regex عبارتهای منطقی نوشتم 

public class RepeatInString {
	private static Consumer<Integer> cOut = System.out::println;
	private static Consumer<String>  sOut = System.out::println;

	public static void main(String[] args) {
		HashMap<String,String> strs = new HashMap<>();
		strs.put("sal","salam");
		strs.put("gol","golgoli");
		strs.put("sas","sasasas");
		strs.put("nan","nanananan");
		strs.put("n","nananananiiinan");
		strs.put("na","nananananiiinan");
		strs.put("zoz","zozozozozozo");
		strs.put(null,null);
		strs.put("","");

		strs.forEach((k,v)-> System.out.printf("%s , %s -> , %d \n",v , k ,StringInString(v,k)));

		private static int StringInString(String one, String two) {
			int cnt = 0;
			if (one == null || two == null || one.isEmpty() || two.isEmpty())
				return cnt;

			String quantifier = two.charAt(0)+"*?"+two.substring(1,two.length());
			//String quantifier1 = two.concat("*?");
			Pattern pattern = Pattern.compile(two.length() > 1 ? quantifier : two);
			Matcher matcher = pattern.matcher(one);

			Predicate<String> sPredicate = pattern.asPredicate();
			boolean a = sPredicate.test(one);
			while (matcher.find()) cnt++;

			return cnt;
		}
		
	}
}

----------


## farhad_shiri_ex

تکرار یک حرف در یک رشته 

    private static boolean isUniqueChars3(String str) {
        int checker =0 ;
        for (int i = 0; i < str.length(); i++) {
            int val = str.charAt(i) - 'a';
            if((checker & (val << 1)) > 0) return false;
            checker |= (val << 1);
        }
        return true;
    }

البته اینطوریم میشه که بشه!!

    private boolean isUniqueChars(String str) {
        byte[] strByte = str.getBytes();
        boolean flag = false;
        for (int j = 0; j < strByte.length; j++) {
            for (int i = j; i < strByte.length; i++) {
                if(Byte.compare(strByte[j],strByte[i]) == 0){
                    flag = true;
                    break;
                }
            }
            if(flag) break;
        }
        return !flag;
    }

----------


## farhad_shiri_ex

پیدا کردن یک مقدار بزرگتر بدون استفاده از بلوک های if

    private int max(int a, int b) {
        int c =  a - b ;
        int k = (c >> 31) & 0x1;
        return a -(k * c );
    }

----------


## farhad_shiri_ex

جمع کردن دو مقدار بدون استفاده از علامت ریاضی (+)

    public int plusNoRecursive(int a , int b)
    {
        int sum , carry ;
        while(b != 0){
            sum   = a ^ b;
            carry = (a & b) << 1;
            a = sum; b = carry;
        }
        return a;
    }

----------


## farhad_shiri_ex

اگر دوستان نظر مثبت داشته باشند ادامه خواهم داد... :تشویق:

----------


## vahid-p

اگر تمام سوالاشو دارید، بدون جواب بذارید هم مفید خواهد بود. با جواب که چه بهتر

----------


## farhad_shiri_ex

واقعیت اش اینه که هدفم اینه که ببینم برنامه نویس های دیگه چطوری مینویسن الگوریتم ها به چه شکلی بعد از چند وقت دیگه کلی چیز میتونیم ازش یاد بگیریم ولی متاسفانه باید بگم کسی خیلی مشارکت نمیکنه البته به جز شما دوست خوبم vahid-p حداقل یه مطلب مینویسید ولی دوستان دیگه نمیدونم چرا کسی هیچ مطلبی نمیگن نمیدونم حالا پست مفید نیست ویا موضوع دیگه ای هست؟!
البته اگر هم پست مفید نیست انتقاد کردن که بد نیست حداقل یه نظر بدید!
یعنی تا حالا کسی به مشکل نوشتن الگوریتم بر نخورده ممکن که این راه حلهایی که من نوشتم جایی استفاده نکنید ولی مطمئنا الگوی پیاده سازی و روش الگوریتم نویسی که همیشه بدردتون خواهد خورد وگرنه تا اونجا که من یادم میاد از سال 80 که من تو المپیاد کامپیوتر شرکت کردم تا همین الان که دوستان خوب وزحمتکشی که تو جاواکاپ دارن این مسابقات رو اجرا میکنن سطح سوالات و نوع به چالش کشیدن برنامه نویس تقریبا یکسان بوده چون هدف تقویت الگوریتم نویسی در زمینه برنامه نویسی کامپیوتر.

----------


## vahid-p

> دوستان دیگه نمیدونم چرا کسی هیچ مطلبی نمیگن نمیدونم حالا پست مفید نیست ویا موضوع دیگه ای هست؟!


یکی از دلایلش اینه خیلی ها عضو نیستن و به عنوان مهمان بازدید میکنند. اخیرا کلا نه تو این انجمن بلکه همه انجمن های فارسی زبان با اومدن گروه های تلگرامی و... بحث ها و سوالاتشون رو میبرن اونجا مطرح می کنند و بدیش اینه که مطالب و سوالات و جوابهاشون به کار شخص دیگه ای نمیاد چون عمومی نیست و قابل جستجو نیست! و به همین دلیل وقت و زمان خیلی ها برای عده کمی هدر میره. و اصلا اینطور نیست که سوالات و مشارکت ها در کل کم شده، اتفاقا با وجود اندروید و رغبت خیلی ها به برنامه نویسی، سوالات بیشتر و بیشتر هم شده اما تو گروه ها مخفی شده. از طرفی با نوتیفیکشن های اپلیکیشن ها خیلی کارهاشون سریعتر پیش میره و مجبور نیستن اینجا یکی دو روز صبر کنن تا یک نفر به سوالشون پاسخ بده. هر چند نظم خاصی نداره گروه ها و من خوشم نمیاد.
با این حال مطالبی که اینجا نوشته میشه در دسترس عموم هست و در کشورهای دیگه هنوز به این روش کار میشه، و برای خوندنش به خیلی ها ممکنه کمک کنه الان و در آینده، هر چند ممکنه مشارکت نباشه.

اما در مورد این سوالات هر چند مربوط به جاوا کاپ هست ولی به نظرم خیلی الگوریتمی است. مثلا "جمع کردن دو عدد بدون +" یا "پیداکردن مقدار بزرگتر بدون if" و با هر زبانی تقریبا همین میشه. کاش سوالاتشون جوری بود که اگر از کلاس های متنوع جاوا استفاده نکنی، کارت به مراتب دشوارتر بشه. با این حال مفید هست و لااقل از دید الگوریتمی، نه لزوما یادگیری جاوا، چالش برانگیز و جالب هستند.
من خودم دوست داشتم راه حل هایی که به ذهنم میاد رو بنویسم ولی فعلا به دلیل درس و دانشگاه خیلی فرصت مشارکت ندارم. اما همانطور که گفتم این سوالات و مطالب شما میمونه و من مثلا چند هفته بعد میتونم بیام سراغش به راحتی و این نظم و قابلیت جستجو باعث میشه بشه به مطالب برگشت و مطالعه کرد.

----------


## farhad_shiri_ex

> کاش سوالاتشون جوری بود که اگر از کلاس های متنوع جاوا استفاده نکنی، کارت به مراتب دشوارتر بشه.


منهم موافقم با گفته شما.
ولی هدف از بیان کردن این سوالات نوشتن برنامه به زبان جاوا نیست همونطور که میدونید تو مسابقات برنامه نویسی به زبانهای ++c و java و python میتونید برای یک سوال الگوریتم بنویسید پس دقیقا هدف من این بود که درباره الگوریتم ها نظر داده بشه.!
والبته با اینم موافقم که تو کانالها الان فعالیت بیشتر هست .
ولی متاسفانه جدیدا دیگه این سایت مثل چند سال پیش فعالیت نداره حالا یه سوال پیش میاد پس چرا StackOverFlow همچنان در راس انجمن هاست حتی با وجود git خود google بازهم به stack نمیرسه البته از نظر رفع مشکلات برنامه نویسی عرض میکنم ولی این تو ایران تقریبا برعکس شده فکر کنم خارجی ها کانال تو تلگرام ندارن  :لبخند گشاده!:  :لبخند گشاده!:  :لبخند گشاده!: 
بیخود نیست که 50 میلیون کاربر تو ایران داره فکر کنم تا چند وقت دیگه بعضی ها یه بات بنویسن برای تلگ که نون و سبزی براشون بخره شاید هم باشه  :لبخند گشاده!:  :لبخند گشاده!:  :لبخند گشاده!: 
وشاید هم یه دلیل دیگه اش منفعت مالی باشه فعالیت در کانالهای تلگرام بالاخره همین دیگه چه کنیم من که خودم به امثال این سایت بیشتر وابسته هستم در هر حال تمامی مطالب عنوان شده در این تاپیک نظر شخصی خودم قصد انتقاد از هیچ مرام و مسلکی ام تو هیچ سایت ویا اامثال اونم ندارم

----------


## ramjm906563

سلام این جوابهای شما در حد آموزشهای جلسات دوره جاوای سایت جاواکاپ نیست و جلوتر از جلسات کدها را استفاده کرده اید لطفا به این نکته توجه داشته باشید می توانید با دانلود اسلاید جلسات با حدود آموزشها آشنا شوید مثلا در مورد اعداد کامل من این کد را نوشته ام :





public class CompleteNumber {
    public static void main(String[] args){
        for(int i=1;i<10000;i++)
            isCompleteNumber(i);


    }
    public static void isCompleteNumber(int a){
        if(f(a))
            System.out.println(a);
    }
    public static boolean f(int x){
        int d=0;
        for(int y=1;y<x;y++){
            if(x%y==0)
                d=y+d;
        }
        if(x==d)
            return true;
        return false;
    }


}

البته ببخشید کددرست paste نمی شود.

----------

